[英]How to properly query Postgresql JSONB array of hashes on Ruby on Rails 6?
[英]JSONB query in Rails for a key that contains an array of hashes
我有一個帶有JSONB列content
的Page
模型的Rails 5項目。 所以結構看起來像這樣(減少到問題的最低限度):
#<Page id: 46, content: {..., "media" => [{ "resource_id" => 143, "other_key" => "value", ...}, ...], ...}>
如何編寫查詢以查找在content
JSONB列的media
鍵下具有某個所需數量的resource_id
的所有頁面? 這是我做的嘗試不起作用(我認為因為數組的每個項目中還有其他鍵/值對): Page.where("content -> 'media' @> ?", {resource_id: '143'}.to_json)
編輯:這有效,但只會檢查媒體數組中的第一個哈希: Page.where("content -> 'media' -> 0 ->> 'resource_id' = ?", '143')
使用sql,這應該為您提供資源ID為143的所有頁面:
select * from pages p where '{"resource_id": 143}' <@ ANY ( ARRAY(select jsonb_array_elements ( content -> 'media' ) from pages where id=p.id ) );
Postgresql有一個名為ANY( postgres docs )的函數,它使用表單expression operator ANY (array)
。 評估左側表達式並使用給定運算符與數組的每個元素進行比較。
由於ANY的右側參數必須是數組(不是json數組),我們使用jsonb_array_elements方法將content-> media json數組轉換為一組行,然后使用ARRAY將其轉換為數組( )。
<@
運算符檢查右側的表達式是否包含左側的表達式。 例如: '{"a": 1}'::jsonb <@ '{"b": 2, "a": 1}'::jsonb
將返回true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.