栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Rails中查询Postgres JSON数组字段

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Rails中查询Postgres JSON数组字段

假设:

  • Postgres 9.4或更高版本
  • “获取所有位于系列5中的用户”的 意思是:
    “具有至少一个包含的数组元素

    {"serie": 5}
    。可能还有其他。”

  • 使用第一个较短的数据格式。没有冗余的“数据”密钥。

简短答案: 使用

jsonb
代替,
json
这才有效:

User.where("groups @> ?", '[{"serie": 5}]')

请注意方括号,以使右侧操作数成为JSON 数组

为什么?

此处的主要误解是:数据类型

json
与相同
jsonb

您没有声明实际的表定义,但稍后进行了注释

json
,问题中有一个提示:

select json_array_elements(groups -> 'data') ->> 'serie' from users;

json_array_elements()
仅适用于
json
,必须
jsonb_array_elements()
适用
jsonb
。但是您尝试使用未为定义的
jsonb
运算符
@>

json

groups -> 'data' @>  '?'

所述操作者

->
将返回相同类型左手输入。但
@>
仅针对
jsonb
而不是进行定义
json

然后,您尝试使用运营商

@>
text
左操作数。 也不可能

groups ->> 'data' @>  ?

运算符

@>
有多种变体,可以用于各种类型(包括Postgres数组),但不能用于
text
和不能用于
json

因此,简短的答案:使用

jsonb
代替
json
。这也允许使用非常 有效的索引

json

对于数据类型,

json
您可以使用:

SELECt *FROM   users uWHERe  EXISTS (   SELECt FROM json_array_elements(u.groups) elem    WHERe  elem ->> 'serie' = '5'   );

演示版

jsonb

SELECt *FROM  (   VALUES (1, jsonb '[{"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}         , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]')        , (2,       '[{"serie":7, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}         , {"serie":8, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]')        , (3,       '[{"serie":9, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}         , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]')   ) users(id, groups)WHERe  groups @> '[{"serie": 5}]';

json

SELECt *FROM  (   VALUES (1, json  '[{"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}         , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]')        , (2,       '[{"serie":7, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}         , {"serie":8, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]')        , (3,       '[{"serie":9, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}         , {"serie":5, "year":3, "specialization":"Matematica", "management_id":1, "group_number":2}]')   ) users(id, groups)WHERe  EXISTS (   SELECt FROM json_array_elements(users.groups) elem    WHERe  elem ->> 'serie'  = '5'   );


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398140.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号