2013-11-27 33 views
1

元素假設在PostgreSQL的9.3以下架構:PostgeSQL:如何檢查是否有任何的JSON陣列匹配標準

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); 

什麼是查詢文件的對象,其中至少一個最好的辦法在「值」數組滿足條件?我能想到的唯一方法是:

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

PostgreSQL是一個object-relational數據庫系統,MongoDB是一個NoSQL數據庫,所以它們之間沒有那種相似的(除了明顯的部分,它們都用於存儲數據)。

如果沒有嵌套查詢,則無法進行搜索。您可以創建postgres函數或自定義類型(或兩者)來幫助您,但仍然需要在內部進行嵌套查詢。

理解像json這樣的postgres結構化數據列並不意味着以這種方式使用是非常重要的。在插入或選擇時轉換數據主要是一種快捷方式和實用工具,因此執行sql查詢的程序不需要進行額外的轉換。

但是,您不應該在像這樣的結構化數據字段中搜索。這是非常低效的,你沒有理由在你的服務器上承受很大的負載,並且you can't use indexes as efficiently(在Igor的評論後更正)。數千行數據庫將無法使用。 (我可以說更多....)。我強烈建議您花時間重新排列更多列和表中的數據,以便您可以使用索引輕鬆進行選擇,而無需嵌套查詢。然後,您可以使用to_json()輕鬆獲取json格式的數據。

編輯/注:

這個答案寫在Postgres的當前版本爲9.3,適用於9.3及之前。幾乎可以肯定的是,Postgres將在未來的(將來)能夠完全支持文檔存儲,並且在元素中進行索引和高效搜索。自9.0以來的每次升級都是朝這個方向邁出的一步。

+0

您可以將最新版本的Postgres用於JSON,但效率不及普通列上的索引。 –

+0

我接受了你的答案,儘管會質疑你對PostgreSQL的觀點僅限於關係模型。使用hstore數據類型,您可以將其用於存儲半結構化文檔。 – Muton

+0

但是,好吧,它不能用作文件存儲,但它看起來,這是我在這裏評估,但有希望:http://www.sai.msu.su/~megera/postgres/talks/hstore- dublin-2013.pdf – Muton

1

嗯......你可以,如果你喜歡子查詢做這樣的事情:

select value 
from (
    select json_array_elements(data -> 'values') 
    from test 
) s(value) 
where value ->> 'name' = 'ghi' 

但除此之外沒有任何功能提供給你想要的東西。但是,您可以輕鬆創建自己的操作員或存儲過程來照顧此問題。

這裏有一個小提琴BTW:http://sqlfiddle.com/#!15/fb529/32

相關問題