簡體   English   中英

Rails中的JSONB查詢包含一個包含哈希數組的鍵

[英]JSONB query in Rails for a key that contains an array of hashes

我有一個帶有JSONB列contentPage模型的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM