假设你要搜索特定的对象具有一定价值的内部对象,此特定对象可以在阵列中的任何地方出现,您需要解压缩文档和每个阵列,测试内部子文档以进行控制并删除,然后重新组装阵列和JSON文档(未经测试):
SELECT id, jsonb_build_object(key, jarray)
FROM (
SELECT foo.id, foo.key, jsonb_build_array(bar.value) AS jarray
FROM ( SELECT id, key, value
FROM my_table, jsonb_each(jdoc)) foo,
jsonb_array_elements(foo.value) AS bar (value)
WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
GROUP BY 1, 2) x
GROUP BY 1;
现在
,这看起来可能有点晦涩难懂,所以百般挑剔你:
SELECT id, key, value
FROM my_table, jsonb_each(jdoc)
这将使用你的桌子上的横向联接采取JSON文件jdoc
并把它变成一组行foo(id, key, value)
其中value
包含数组。 id
是您的表的主键。
然后我们得到:
SELECT foo.id, foo.key, jsonb_build_array(bar.value) AS jarray
FROM foo, -- abbreviated from above
jsonb_array_elements(foo.value) AS bar (value)
WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
GROUP BY 1, 2
这将使用另一种横向连接到阵列解压到bar(value)
行。现在可以使用包含运算符搜索这些对象以从结果集中删除对象:WHERE NOT bar.value @> '{"bar1": 123}'::jsonb
。在选择列表中,阵列由id
和key
重新组装,但现在没有违规的子文档。
最后,在主查询的JSON文件重新组装:
SELECT id, jsonb_build_object(key, jarray)
FROM x -- from above
GROUP BY 1;
了解的重要一点是,PostgreSQL的JSON功能只在JSON文件,你可以明确地指示的水平运行。通常,这是文档的顶层,除非您在文档中具有某个级别的明确路径(如{foo1, 0, bar1}
,但您没有)。在这个级别的操作中,您可以解压缩以执行处理,例如移除对象。