我正在尝试查询Postgres数据库中的某个值。我groups
在users
表中有一个命名字段,可以用以下两种方式之一表示:
1。
groups: {"data"=>[{"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。
groups: [{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]
我对这两种表示形式都满意。但是,我似乎无法找出如何让意甲5中的所有用户都说出来。我按照以下方式尝试了多个查询:
@users = User.where("groups ->> 'data' @> ?", {serie: 5})
@users = User.where("groups -> 'data' @> '?'", {serie: 5})
@users = User.where("groups ->> 'data' ->> 'serie' = ?", 5)
还有许多其他尝试,比其他尝试更愚蠢(请参见上文)。我该怎么办?
我已经能够确定:
select groups -> 'data' ->> 'serie' from users;
ERROR: cannot extract field from a non-object.
但是,以下查询有效:
select json_array_elements(groups -> 'data') ->> 'serie' from users;
我认为我没有正确地传递列中的数据。我提供的创建的哈希是:
pry(#<Overrides::RegistrationsController>)> @response['data']['user']
=> {"last_name"=>"Doe1",
"first_name"=>"John1",
"email"=>"c0f45@example.com",
"groups"=>
{"data"=>
[{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]}}
保存资源之前如下所示:
pry(#<Overrides::RegistrationsController>)> @resource
=> #<User id: nil, provider: "email", uid: "", first_name: "John1", last_name: "Doe1", email: "c0f45@example.com", role: "Student", created_at: nil, updated_at: nil, groups: {"data"=>[{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]}>
假设:
“获取所有位于系列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 u
WHERE 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'
);
问题内容: 我在C#中使用elasticsearch.net库,并尝试查询与指定过滤器匹配的对象。 我希望查询返回对象,其中对象的Names集合中至少存在来自过滤器的输入名称之一。 问题是此查询的结果总是使我命中0次,即使我确定数据库中确实存在与指定过滤器匹配的数据,我也想找出我的查询出了什么问题… 该模型: 过滤对象: 查询数据的方法: 我也尝试过以下查询,但都没有产生预期的结果: 适用于我的解
我有一个非常特别的问题,关于查询嵌套到数组字段的布尔字段和字符串字段。索引映射如下所示: 文档索引还有许多其他字段,这些字段没有嵌套到数组字段中,但必须包含在查询字段中。我尝试了一种使用过滤器和布尔查询的方法,如下所示: 这个查询的问题是,它返回的文档在我看来不必返回。在这种情况下,文件如下所示: 您可以注意到,array_field_1的第三项包含boolean_field_2:false和正在
以下操作正在控制台中尝试,用于启用postgis的铁路4.2应用程序。 lat和lon定义为十进制值。这转化为以下查询 与错误: 我认为我需要为这些值声明数据类型(几何或地理),但不确定如何声明。我还想知道ST_DWithin函数是否可以处理3857数据类型,即使文档中没有说明。 注意@target对象还具有一个属性,该属性在postgresql中定义为一个带有:srid的空间值= 最新消息 返回
我尝试使用函数JSON\u array\u elements()卸载JSON数组,并尝试使用JSON\u array\u length(field\u name)计算数组的元素,但没有成功。我使用的是PostgreSQL 9.4.5。 我想查询元素“name”的结果,这是json类型数组field crew | json[]上保存的数据。
问题内容: 是否存在通过查询字符串传递数组的标准方法? 需要明确的是,我有一个带有多个值的查询字符串,其中一个是数组值。我希望将该查询字符串值视为一个数组-我不希望该数组爆炸,以使其与其他查询字符串变量没有区别。 编辑: 根据@Alex的答案,没有标准的方法可以执行此操作,因此我的后续工作是什么才是 识别 我正在读取的参数同时是 PHP 和 Javascript 数组的简单方法? 用相同的名称命名
问题内容: 我正在尝试配置参数化查询以达到以下效果: 我正在使用的数据库是Postgres。 此查询在未参数化的情况下成功运行,但是我想使用带有JdbcTemplate的参数化查询来填充有效的field2值(整数)列表。 尝试不同的值(,,,或上查询),我试过的变化: 和 并且 附带说明,描述如何参数化查询的资源也将非常有帮助。 所有这些查询都抛出PSQLExceptions,这些异常指示操作符失