我正在开发一个使用Postgres
JSON
数据类型的Rails应用程序。我在名为data
的表中有一个JSON列reports
。假设我有多个这样的条目:
Entry 1: {"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 2, "src":"barB.png", "pos": "top"}], "background":"background.png"}
Entry 2: {"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 2, "src":"barC.png", "pos": "top"}], "background":"bacakground.png"}
Entry 3: {"objects":[{"album": 1, "src":"fooA.png", "pos": "middle"},{"album": 2, "src":"barB.png", "pos": "middle"}],"background":"background.png"}
Entry 4: {"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 3, "src":"barB.png", "pos": "top"}], "background":"backgroundA.png"}
我想做的是返回具有相同唱片集,src和背景的条目的不同组合(注意:在objects
节点内,数组元素的顺序无关紧要)。例如,查询应将条目1,3作为一组进行匹配,将条目2与另一组进行匹配,依此类推。目标是找到前3个最常见的组合。我知道如何使用Ruby来执行此操作,但是我必须查询大量条目,然后遍历所有条目。如果Postgres可以处理此任务,则似乎效率更高。我还不足以让SQL专家知道这是否可行。
这是我想要的结果。在其中objects
,条目1和3都包含{"album": 1, "src":"fooA.png"}, {"album": 2, "src":"barB.png"}
,并且都具有匹配项backgrounds
。我想将它们组合为一个2的组合。
由于条目2在此条件下不匹配任何条目,因此它是计数为1的另一个组合。条目4也被认为是计数为1的另一个组合。因此,我得到的结果是:
ids | count
--------------
1,3 | 2
2 | 1
4 | 1
要么
combinations | count
---------------------------------------------------------------------------------------------------------------------------------------------------
{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 2, "src":"barB.png", "pos": "top"}], "background":"background.png"} | 2
{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 2, "src":"barC.png", "pos": "top"}], "background":"bacakground.png"} | 1
{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 3, "src":"barB.png", "pos": "top"}], "background":"backgroundA.png"} | 1
以较容易实现的为准。
在我的实际数据中,我在节点内的JSON数组中具有除just
album
和以外的其他值。您会注意到,我已经包括了此案例。我只关心使用,和值相匹配的连击。我希望忽略任何其他值。src``objects``pos``album``src``background
注意
当我测试Erwin的解决方案时,我不断收到此错误,我知道为什么:
ERROR: cannot call json_populate_recordset on a nested object
我的json值实际上要复杂一些。例如:
{"objects":[{"album": 1, "src":"fooA.png", "pos": "top", filters: []}, {"album": 2, "src":"barB.png", "pos": "top", filters: []}
显然,filters
是一个嵌套对象,不受的支持json_populate_recordset
。但是,如果没有简单的选择,我想我可以解决此问题。同样,我认为这是可能的吗?
更新
由于上述示例数据中有错别字(这是我的错),因此该解决方案有点不完整。修正错字时,解决方案不起作用。在这里找到这种情况的答案。但是,Erwin的解决方案仍然可以解决与上述情况类似的情况。
给定此表(您应该以这样的形式提供):
CREATE TABLE reports (rep_id int primary key, data json);
INSERT INTO reports (rep_id, data)
VALUES
(1, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 2, "src":"barB.png", "pos": "top"}], "background":"background.png"}')
, (2, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 2, "src":"barC.png", "pos": "top"}], "background":"bacakground.png"}')
, (3, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "middle"},{"album": 2, "src":"barB.png", "pos": "middle"}],"background":"background.png"}')
, (4, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"}, {"album": 3, "src":"barB.png", "pos": "top"}], "background":"backgroundA.png"}')
;
使用
json_populate_recordset()
了unnesting记录"objects"
。该函数需要注册的行类型来定义结果列的名称和数据类型。出于本演示的目的或通常用于即席查询的目的,以以下内容建模的
临时表"objects"
提供了相同的内容:
CREATE TEMP TABLE obj(album int, src text, pos text);
找到the top 3 most common combinations
… of entries that have the same album, src, and background
:
SELECT array_agg(r.rep_id) AS ids, count(*) AS ct
FROM reports r
, json_populate_recordset(null::obj, r.data->'objects') o
GROUP BY r.data->>'background'
, o.album
, o.scr
ORDER BY count(*) DESC
LIMIT 3;
无论是否来自同一行,每个对象都很重要。您没有html" target="_blank">定义如何正确处理。因此,rep_id
可以在数组中多次弹出ids
。添加DISTINCT
到array_agg()
折叠可能的重复项。在这种情况下,计数ct
可以大于数组的长度ids
。
需要JSON函数和运算符以及隐式的JOIN LATERAL
Postgres 9.3 。
json_array_elements()
只是取消嵌套json数组,而无需将结果转换为SQL行。相应地使用JSON运算符访问各个字段。
SELECT array_agg(r.rep_id) AS ids, count(*) AS ct
FROM reports r
, **json_array_elements(r.data- >'objects')** o
GROUP BY r.data->>'background'
, **o- >>'album'**
, **o- >>'scr**'
ORDER BY count(*) DESC
LIMIT 3;
我问了这个问题作为对另一个问题的评论,也在mongodb-user上发布了一个问题。到目前为止没有回复,所以我求助于问一个单独的问题。 文件说明: 如果字段包含一个数组,则$in操作符选择其字段包含数组的文档,该数组至少包含一个与指定数组中的值匹配的元素(例如,等等) 我正在使用: 在MongoDB外壳中: 下面是应根据文档及其生成的结果工作的查询列表: 为什么这个不行? 为什么我需要所有的钱?
问题内容: 我有一个从数据库(JSON MySQL中的数据存储)检索数据的程序。 我设法得到对象。输出为: JSON对象: 我需要有关如何处理数据并将信息放入不同数组/对象的建议。例如 谢谢。 问题答案: 您可以使用Jackson Api来实现。 您必须创建与json对象相同的Pojo类(该类应具有“ attributes”,“ uuid”之类的成员)。 这是您必须使用的类 和代码 现在,您可以使
问题内容: 我对mongodb还是很陌生,有一件事我现在无法解决: 假设您有以下文档(简体): 哪个查询将返回json-object,其值等于“ value2”? 这意味着,我需要这个json-object: 当然,我已经尝试了很多可能的查询,但是没有一个返回正确的查询,例如 有人可以帮我看看我在做什么错吗? 谢谢! 问题答案: 使用位置运算符 输出量 使用聚合 输出 使用Java驱动程序 输出
如何使用jolt转换将平面JSON转换为嵌套JSON?我对JSON和jolt是新手。 输入: 预期输出: 编辑:我想在< code>SubFunds中添加一个新字段,但是新字段不在JSON文件中,它是计算字段,我可以按原样添加示例吗 并重命名字段:
我尝试使用函数JSON\u array\u elements()卸载JSON数组,并尝试使用JSON\u array\u length(field\u name)计算数组的元素,但没有成功。我使用的是PostgreSQL 9.4.5。 我想查询元素“name”的结果,这是json类型数组field crew | json[]上保存的数据。
我试图用C#在MongoDB中用嵌套数组文档实现文本搜索功能。我有一个以下格式的MongoDB集合。