如何通过哈希值在JSON哈希数组中进行搜索?

时间:2016-10-06 12:01:33

标签: ruby-on-rails json ruby postgresql

我正在使用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的用户。

谢谢!

5 个答案:

答案 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)

根据数组JSONB中对象的值进行过滤

如果您要使用postgres在Rails中基于数组内对象(jsonb)的值制作过滤器,则可以使用以下示例。

假设您有产品模型:

Product.select("*").from(
  Product.select("*, jsonb_array_elements(registers) as register")
).where("(register ->> 'price')::numeric >= 1.50")

在上面的示例中,我们选择价格大于或等于1.50的所有产品。

为此,我们使用:

我将ident应用于子查询只是为了获得最佳可读性。

将其置于范围内或使用其他最佳实践之后。

答案 4 :(得分:0)

我混合使用了以上答案。这是我的工作代码:

User.where("locations::jsonb @> ?", [{kind: 'office'}].to_json)

请注意,locationsJSON表的User列(不是JSONB数据类型)