假设PostgreSQL 9.3中有以下架构:
create table test (data json);
insert into test values ('{
"id" : 1,
"name" : "abc",
"values" : [{"id" : 2, "name" : "cde"}, {"id" : 3, "name" : "def"}]
}'::json);
insert into test values ('{
"id" : 4,
"name" : "efg",
"values" : [{"id" : 5, "name" : "fgh"}, {"id" : 6, "name" : "ghi"}]
}'::json);
查询“values”数组中至少有一个对象满足条件的文档的最佳方法是什么?我能想到的唯一方法是:
select data
from (select
data,
json_array_elements(data->'values')->>'name' as valueName
from test) a
where valueName = 'ghi';
有没有办法在没有嵌套查询的情况下执行此操作?在MongoDB中我可以简单地说:
db.test.find({values : {$elemMatch : {name : "ghi"}}});
答案 0 :(得分:1)
嗯......如果你更喜欢子查询,你可以做这样的事情:
select value
from (
select json_array_elements(data -> 'values')
from test
) s(value)
where value ->> 'name' = 'ghi'
但除此之外,没有任何功能可以做你想要的。您可以轻松创建自己的运算符或存储过程来处理此问题。
答案 1 :(得分:0)
PostgreSQL是一个object-relational数据库系统,MongoDB是一个NoSQL数据库,因此它们之间没有任何相似之处(除了它们都用于存储数据的明显部分)。 / p>
如果没有嵌套查询,则无法进行搜索。您可以创建一个postgres函数或自定义类型(或两者)来帮助您,但仍然需要在内部进行嵌套查询。
理解像json这样的postgres结构化数据列并不意味着以这种方式使用是非常重要的。它主要是在插入或选择时转换数据的快捷方式和实用程序,因此执行sql查询的程序不需要进行额外的转换。
但是,您不应该在这样的结构化数据字段中搜索。这是非常低效的,你无缘无故地在你的服务器上施加了很大的负担you can't use indexes as efficiently
(在Igor的评论之后纠正)。您的数据库将变得无法使用几千行。 (我可以说更多......)。我强烈建议您花时间在更多的列和表中重新排列数据,这样您就可以使用索引和没有嵌套查询轻松地从中选择数据。然后,您可以轻松使用to_json()
以json格式获取数据。
编辑/注意:
这个答案是在Postgres的当前版本为9.3并且适用于9.3及之前版本时编写的。几乎可以肯定,Postgres将能够完全支持文档存储,在(近)未来的元素中进行完全索引和高效的搜索。自9.0以来的每次升级都是向这个方向迈出的一步。