[英]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.