2017-06-10 86 views
0

我試圖查詢Postgres(Amazon RDS上的9.6)中的JSON數據結構。數據包含一個對象數組,該對象數組又包含一個包含對象數組的元素。我想查找匹配其中一個嵌套數組中的鍵+值的所有記錄。在Postgres中有效查詢嵌套數組的JSON

鑑於行是這樣的:

{"drinkers" : [ 
    {"name" : "geoff", 
    "beers" : [ 
    {"name": "PBR"}, 
    {"name" : "Bud Select"} 
    ]}, 
    {"name" : "tom", 
    "beers" : [ 
    {"name": "Bud Light"}, 
    {"name" : "Busch"} 
    ]} 
]} 

我想找到那裏是一個drinkers.beers對象的名字是「PBR」的所有行。我來最近的是這樣的:

select jsonb_data 
from bars 
where jsonb_array_elements(jsonb_array_elements(data -> 'drinkers') -> 'beers') ->> 'name' = 'PBR'`` 

但是這不起作用,因爲where返回一個列表,而不是一個真正/假的匹配。我已經提出了使用子查詢,橫向連接等的其他解決方案,但所有這些解決方案都存在性能問題,即使使用了適當的杜松子酒索引。有關如何在Postgres中查詢這樣的數據結構的任何建議?

+0

[內部ArrayField Django的JSONField](的可能的複製https://stackoverflow.com/questions/41134260/django- jsonfield-內部-arrayfield) – e4c5

回答

1

您是否嘗試過使用IN運算符?

WHERE 'PBR' IN (
    SELECT jsonb_array_elements(jsonb_array_elements(data -> 'drinkers') -> 'beers') ->> 'name' 
); 

另一種方法將是使用JSONB contain(即@>):

WHERE data -> 'drinkers' @> '[{"beers": [{"name": "PBR"}]}]'; 
0

對不起,這應該可能只是一個評論,但如果返回名稱的語句給你一個列表或數組,你可能使用'PBR' = ANY jsonb_array_elements(...