活动记录 postgres 检查 jsonb 数组是否包含 x 或 y
active-record postgres check if jsonb array contains x or y
我有一个 table 和一个 jsonb 列,该列有一个嵌套的 json 数组。我想找到嵌套数组至少包含一个值的所有记录。
例如,我的模型 Person 有一个名为 preferences 的 jsonb 列。在 jsonb 首选项中,有几个键,其中一个值是一个数组:
Person.first.preferences = {"diet" => {"foods" => ["apples", "oranges", "bananas"]}}
我想创建一个查询,returns 所有偏好 -> 饮食 -> 食物包括 'apples' 或 'mangos'(例如)的人。
目前,我可以通过 1 个输入(即 'apples')获得这样的结果:
Person.where('preferences @> ?', {'diet' => {'foods' => ['apples']}}.to_json)
和多个输入,如果它们都存在于数组中。因此,如果我传入 'apples' 和 'oranges',结果将返回,因为该记录包括苹果和橙子。
Person.where('preferences @> ?', {'diet' => {'foods' => ['apples', 'oranges']}}.to_json)
有没有办法传入多个变量(即 ['apples'、'mangos'])并检查嵌套的 jsonb 数组是否包含苹果或芒果但不包含两者都必须吗?
以下查询没有结果,因为我的人的食物偏好不包括芒果,尽管它们包括苹果。
Person.where('preferences @> ?', {'diet' => {'foods' => ['apples', 'mangos']}}.to_json)
使用 Rails 5.2 和 Postgresql 10
谢谢!
首先要做的是使用 ->
或 #>
获取数组,然后您可以使用 ?|
operator 检查数组是否与您正在查找的内容重叠为了。像这样 SQL:
preferences->'diet'->'foods' ?| array['apples', 'mangos']
或使用 ActiveRecord:
Person.where("preferences->'diet'->'foods' ?| array[:foods]", foods: ['apples', 'mangos'])
我有一个 table 和一个 jsonb 列,该列有一个嵌套的 json 数组。我想找到嵌套数组至少包含一个值的所有记录。
例如,我的模型 Person 有一个名为 preferences 的 jsonb 列。在 jsonb 首选项中,有几个键,其中一个值是一个数组:
Person.first.preferences = {"diet" => {"foods" => ["apples", "oranges", "bananas"]}}
我想创建一个查询,returns 所有偏好 -> 饮食 -> 食物包括 'apples' 或 'mangos'(例如)的人。
目前,我可以通过 1 个输入(即 'apples')获得这样的结果:
Person.where('preferences @> ?', {'diet' => {'foods' => ['apples']}}.to_json)
和多个输入,如果它们都存在于数组中。因此,如果我传入 'apples' 和 'oranges',结果将返回,因为该记录包括苹果和橙子。
Person.where('preferences @> ?', {'diet' => {'foods' => ['apples', 'oranges']}}.to_json)
有没有办法传入多个变量(即 ['apples'、'mangos'])并检查嵌套的 jsonb 数组是否包含苹果或芒果但不包含两者都必须吗?
以下查询没有结果,因为我的人的食物偏好不包括芒果,尽管它们包括苹果。
Person.where('preferences @> ?', {'diet' => {'foods' => ['apples', 'mangos']}}.to_json)
使用 Rails 5.2 和 Postgresql 10
谢谢!
首先要做的是使用 ->
或 #>
获取数组,然后您可以使用 ?|
operator 检查数组是否与您正在查找的内容重叠为了。像这样 SQL:
preferences->'diet'->'foods' ?| array['apples', 'mangos']
或使用 ActiveRecord:
Person.where("preferences->'diet'->'foods' ?| array[:foods]", foods: ['apples', 'mangos'])