对JSONB对象数组的PostgreSQL查询

对JSONB对象数组的PostgreSQL查询,sql,postgresql,nosql,Sql,Postgresql,Nosql,我有一个具有这种复杂结构的PostgreSQL表: "item": [{ "field10", "field11", "field12": { "field20" }, "field13": [{ "field21": [{

我有一个具有这种复杂结构的PostgreSQL表:

"item": [{
        "field10",
        "field11",
        "field12": {
            "field20"
        },
        "field13": [{
                "field21": [{
                        "field30"
                    }
                ],
                "field22": [{
                        "field31"
                        "field32": {
                            "field40"
                        }
                    }
                ],
            }
        ]
    }]
我必须对filter进行查询,直到字段40比我看到的更多解释都是针对对象的,更简单。 你能解释一下我该怎么做吗

编辑:

我做的例子比现实更简单。实际上,这个物体很长。如果我试着用值做一个简单的例子,那是这样的:

{
"uuid": "64fc7a55-be2d-41d8-99c1-d08fa5780731",
"item": [{
            "field10" : 2004,
            "field11" : false,
            "field12": {
                "field20" : "cc092aa1-6465-4526-9292-373344ed3e18",
                "field21" : "AMAZONE"
            },
            "field13": [{
                    "field22": [{
                            "field30" : "ee5bfd21-b2ce-453e-94a2-ef9c87002758",
                            "field31" : "MICROSOFTE"
                        },{
                            "field30" : "2eb39939-08b9-4456-9b5b-eff88f00bacb",
                            "field31" : "GOOGLEE"
                        }
                    ],
                    "field23": [{
                            "field32" : "e70bec99-689a-4c5d-ab81-e7601bc5b435",
                            "field33": {
                                "field40" : "a70ce09e-21ec-46cd-bfe6-591b84c0b328",
                                "field41" : "https://stackoverflow.com/"
                            }
                        },{
                            "field32" : "e70bec99-689a-4c5d-ab81-e7601bc5b435",
                            "field33": {
                                "field40" : "7bfa6882-2e65-4f96-b4a5-6aa0d148a95d",
                                "field41" : "https://gis.stackexchange.com/"
                            }
                        }
                    ],
                }
            ]
        }]
},
{
"uuid": "f131864a-338e-4f2c-91b1-13950958bd62",
"item": [{
            "field10" : 2012,
            "field11" : false,
            "field12": {
                "field20" : "2b8176e4-c858-4159-b279-d852df77c63b",
                "field21" : "PIXABAYE"
            },
            "field13": [{
                    "field22": [{
                            "field30" : "9e70b3d8-8f3f-4ae1-ba64-86efa513bd28",
                            "field31" : "IOBEYAE"
                        },{
                            "field30" : "0150dba2-98de-4143-bd81-329b74874403",
                            "field31" : "PINTERESTE"
                        }
                    ],
                    "field23": [{
                            "field32" : "3ab19111-513a-47db-9fb5-52dc0a1e1c4d",
                            "field33": {
                                "field40" : "7be95726-6698-4bdd-8f6b-2595d1704a2a",
                                "field41" : "https://google.com/"
                            }
                        },{
                            "field32" : "7993aba5-f13f-4998-af7b-9b0b8aec8aa9",
                            "field33": {
                                "field40" : "4740dbcf-84c4-40ff-a633-9207e79cabf4",
                                "field41" : "https://yahoo.com/"
                            }
                        }
                    ],
                }
            ]
        }]
}
在本例中,我的Postgres表有两列,一列带有主键uuid,另一列带有jsonb项中的对象
例如,我想对我的项目做一个过滤器,在这个例子中,如果我搜索“field41”=,其中“field41”包含et的值“gis.stackexchange.com”https://yahoo.com/“uuid”=“uuid”:“64fc7a55-be2d-41d8-99c1-d08fa5780731”的元组将不会出现在PostgreSQL v12及更高版本的结果中,您可以使用jsonpath语言编写这样的查询:

SELECT uuid
FROM jtab
WHERE jsonb_path_exists(
         item,
         '$[*].field13[*].field23[*].field33.field41 ? (@ == "https://yahoo.com/")'
      );

您的问题表明,您还需要在
“field41”
中完成URL的部分匹配。这可以通过使用
jsonb\u array\u元素枚举每个嵌套数组来实现,然后使用
其中。。。如…
筛选与所需域名匹配的记录:

选择
t、 数据->>“uuid”作为uuid,
jfield23->'field33'->'field40'作为field40,
jfield23->'field33'->'field41'作为field41
从…起
jtest t,
jsonb_数组_元素(t.data->‘item’)作为jitem,
jsonb_数组_元素(jitem->‘field13’)作为jfield13,
jsonb_数组_元素(jfield13->“field23”)作为jfield23
其中jfield23->“field33”->>“field41”类似于“%”| | | yahoo.com“| |”%”
为了便于说明,我在
SELECT
子句中包含了相关的
field40
field41


请参阅上的完整示例。

请重新措辞并尝试更好地解释,同时提供所需的输出。例如,我需要在fieldname field40上制作一个过滤器。“从mytable中选择*”(…)我看到了很多技术,但在这个子级别中没有。这不是有效的JSON。“项”是否为数组?你混合了两种可能性。“field20”和“field40”没有值。或者它们是价值观?关键是什么?或者“field32”是一个数组?你想要实现什么?你想在任何嵌套的JSON中找到“field40”,还是想在这个(更正的)结构中得到“field40”的值?好的,我编辑了我的帖子,如果不清楚,很抱歉。对于你的答案,item是一个jsonb[]“field20”和“field40”有值,键是item字段外的“uuid”字段,“field32”不是数组,它是一个简单的字段。例如,我想在我的项目上做一个过滤器,在这个例子中,如果我搜索“field41”=“www.google.fr”带有“uuid”=“uuid”的元组,“64fc7a55-be2d-41d8-99c1-d08fa5780731”将不在结果中,我的Postgres版本是11.8:-(但这是一个很好的可能性!对于Postgres<12的人来说,这是可行的!