我正在使用Postgres的JSON数据类型来存储一些信息。
例如,我的模型User
带有一个字段locations
,它包含一个json文档(包含键和值对的对象数组),格式如下:
[{"name": "Location 1", kind: "house"},
{"name": "Location 2", kind: "house"},
{"name": "Location 3", kind: "office"},
...
{"name": "Location X", kind: "house"}
]
我想在JSON数据类型上使用.where
进行查询。
我想查询至少有一个位置为kind = office
的用户。
谢谢!
答案 0 :(得分:5)
我想查询位置类型
的用户office
# if locations is jsonb type
User.where('locations @> ?', { kind: 'office' }.to_json)
# if locations is json type
User.where("locations->>'kind' = 'office'")
# if locations is array of hashes
User.where('locations @> ?', [{ kind: 'office' }].to_json)
答案 1 :(得分:2)
来源:https://www.postgresql.org/docs/current/static/functions-json.html
User.where("name::jsonb -> 'location' ->> 'kind' = ?", 'office')
答案 2 :(得分:1)
只是给我两分钱:
我有一个带有密钥和内部数组的JSON模型,所以它看起来像这样:
ModelObj: attribute: { key: [val0, val1, val2, val3] }
我需要查找所有对象,例如,键中数组中有val3的属性。 我将属性类型更改为jsonb,这就是我找到它的方式:
Model.where('attribute @> ?', {key: ['val3']}.to_json)
也许对那里的人有用。
答案 3 :(得分:1)
如果您要使用postgres在Rails中基于数组内对象(jsonb)的值制作过滤器,则可以使用以下示例。
假设您有产品模型:
Product.select("*").from(
Product.select("*, jsonb_array_elements(registers) as register")
).where("(register ->> 'price')::numeric >= 1.50")
在上面的示例中,我们选择价格大于或等于1.50的所有产品。
为此,我们使用:
jsonb_array_elements()
来自postgres; 我将ident应用于子查询只是为了获得最佳可读性。
将其置于范围内或使用其他最佳实践之后。
答案 4 :(得分:0)
我混合使用了以上答案。这是我的工作代码:
User.where("locations::jsonb @> ?", [{kind: 'office'}].to_json)
请注意,locations
是JSON
表的User
列(不是JSONB
数据类型)