PostgreSQL JsonB根据对象属性查询JSON数组中的对象

Posted

技术标签:

【中文标题】PostgreSQL JsonB根据对象属性查询JSON数组中的对象【英文标题】:PostgreSQL JsonB query for object in JSON array based on object attributes 【发布时间】:2015-09-09 20:24:25 【问题描述】:

所以我已经在 *** 上看到了对这个问题的其他一些回复,但没有一个对我有用。


    "data": 
        "list": [
            "id": "2ac5bf6f-bc4a-49e8-8f9f-bc518a839981", "type": "type1",
            "id": "d15ac090-11ce-4c0c-a05d-d4238f01e8b0", "type": "type3",
            "id": "b98958fa-87c4-4dcc-aa84-beaf2b32c5c0", "type": "type1",
            "id": "854f4d2a-f37c-42cb-9a1f-17a15454a314", "type": "type2",
            "id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2",
            "id": "0f7f4ced-61c2-45da-b15c-0e12058f66a7", "type": "type4"

        ]
    

这个 Json 存储在一个名为“questions”的字段中,现在我想在这个表中查询列表中具有某个 id 的对象。所以说我有 id 555816da-4547-4a82-9e7e-1e92515bd82b,我想返回

"id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2" 

我在互联网上看到的(主要是这里)没有奏效的解决方案在这里:

SELECT questions->'data'->'list' 
FROM assignments 
WHERE id='81asd6230-126d-4bc8-9745-c4333338115c' 
AND questions->'data'->'list' @> '["id":"854f4d2a-f37c-42cb-9a1f-17a15454a314"]';

我已经在多个不同的响应中看到了这个解决方案,但它根本没有缩小数组的范围,它每次都返回完整的东西。 where 子句中的第一个 id 是我想要的特定分配对象的 id,在这里几乎无关紧要。

SELECT questions->'data'->'list' 
FROM assignments 
WHERE id='81asd6230-126d-4bc8-9745-c4333338115c' 
AND questions->'data'->'list' @> '["id":"854f4d2a-f37c-42cb-9a1f-17a15454a314"]';

这不返回任何内容。

有没有人知道如何轻松做到这一点?

【问题讨论】:

【参考方案1】:

你可以使用函数jsonb_array_elements(jsonb)来选择一个json数组的所有元素:

select jsonb_array_elements(questions->'data'->'list') elem
from assignments
where id='81asd6230-126d-4bc8-9745-c4333338115c'

                              elem
-----------------------------------------------------------------
 "id": "2ac5bf6f-bc4a-49e8-8f9f-bc518a839981", "type": "type1"
 "id": "d15ac090-11ce-4c0c-a05d-d4238f01e8b0", "type": "type3"
 "id": "b98958fa-87c4-4dcc-aa84-beaf2b32c5c0", "type": "type1"
 "id": "854f4d2a-f37c-42cb-9a1f-17a15454a314", "type": "type2"
 "id": "555816da-4547-4a82-9e7e-1e92515bd82b", "type": "type2"
 "id": "0f7f4ced-61c2-45da-b15c-0e12058f66a7", "type": "type4"
(6 rows)

如果要选择具有特定id 的元素,请使用上述查询:

select elem
from (
    select jsonb_array_elements(questions->'data'->'list') elem
    from assignments
    where id='81asd6230-126d-4bc8-9745-c4333338115c'
    ) sub
where elem->>'id' = '854f4d2a-f37c-42cb-9a1f-17a15454a314'

                              elem
-----------------------------------------------------------------
 "id": "854f4d2a-f37c-42cb-9a1f-17a15454a314", "type": "type2"
(1 row)

【讨论】:

酷,这有效,我将如何在类似情况下进行更新,我有问题的 id 并想更新其类型属性? 在 Postgres 9.4 中没有修改 jsonb 元素的功能。您可以整体更新 jsonb 值。查看相关答案:How do I modify fields inside the new PostgreSQL JSON datatype? 和 Update certain array elements of a json array in PostgreSQL 9.4。 在Postgres 9.5你将能够使用函数jsonb_set()

以上是关于PostgreSQL JsonB根据对象属性查询JSON数组中的对象的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 查询 JSONB 字段中的对象数组

Postgresql:搜索jsonb对象数组时如何使用动态值?

单个 postgresql 查询中的文本和 jsonb 连接

使用 Sequelize.js 和 PostgreSQL 在关联模型上查询 JSONB 字段

postgresql:jsonb在一个查询中更新多个键

使用 jsonb 数据类型的 PostgreSQL 插入查询