繁体   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