PostgreSQL:根据嵌套在对象数组中的另一个对象内的对象中是否存在动态字段来查询 table

PostgreSQL: Querying a table based on the existence of a dynamic field in an object nested inside another object which is in an array of objects

在 table items 中,我有一个名为 users 的 jsonb 列。 users 的 JSON 结构遵循以下示例:

[
    {
        "required": 1,
        "agents": {
            "user1": "A",
            "user2": "P",
            "user3": "A"
        }
    },
    {
        "required": 3,
        "agents": {
            "user1": "P",
            "user4": "P",
            "user5": "P"
        }
    }
]

注意tableitems有很多字段,但是为了简单起见,我们可以认为它只有一个item_id和一个users字段.我在 SO 上看到的所有答案都直接在数组内提供对对象元素的查询。

我也希望我能以更好的方式重写对象的结构,但在这种情况下这不是我的决定:D.

我是 postgres 中 JSON 查询的新手,所以我尝试写了几个查询但没有成功。

问题: 我试图找到一个查询,它可以 return 所有 items 在数组中任何元素的 agents 子对象中有一个键 'user4'。有什么建议吗?

使用函数jsonb_array_elements()?运算符:

select i.*
from items i
cross join jsonb_array_elements(users)
where value->'agents' ? 'user4' 

JSON Functions and Operators.