问题标签 [jsonb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3217 浏览

sql - JSONB:用作表达式的子查询返回的不止一行

我(仍然)是 postgresql 和 jsonb 的新手。我正在尝试从子查询中选择一些记录并被卡住。我的数据列如下所示(jsonb):

这是我的查询。我想选择年龄大于 30 岁的“Bob”的所有名字:

我得到错误:

我不太明白。如果我做一些简单的替换(仅用于测试),我可以这样做:

并返回两行。

0 投票
0 回答
39 浏览

json - 使用 GIN 的 JSONB 索引在 postgres 上不起作用

我在 postgresql 上为 jsonb 列创建了索引,但是当我通过解释命令分析时,索引似乎不起作用。

这是我添加索引的命令。

这是解释代码。

也许索引不起作用。我的索引命令有错误吗?当前的 psql 版本是9.4.1

谢谢。

0 投票
1 回答
798 浏览

postgresql - 如何使用多个条件过滤 jsonb?

我有以下表结构:

以下数据(部分为简洁起见......请注意年份的随机性和销售/费用年份彼此不一致):

对于每个员工,我需要评估最近更新的行,并找到 2014 年电视销售额大于 30 的员工。从那里我需要进一步过滤平均电视费用低于 5 的员工。对于平均值,我只需要取他们所有的电视费用,而不仅仅是最新的一排。

我的预期输出将是 1 行:

我可以(有点)做1或其他但不能同时做:

一个。获得 2014 年销售额 > 30(但无法获得他们最近的“电视”销售额;(

湾。获取 2013 年的平均费用(这需要是平均电视费用)

编辑:这可能是一个非常大的表,因此任何关于性能和索引需求的评论都将不胜感激,因为我对 postgresql 和 jsonb 都是新手。

编辑#2:我已经尝试了这两个答案,但对于大桌子来说似乎都没有效率;(

0 投票
1 回答
634 浏览

sorting - 在 Postgresql 9.4 中对 jsonb 对象进行排序

我面临的问题不是我无法进行排序,而是正确的排序。也就是说,我存储为 jsonb 的对象需要在显示在表格中之前进行排序。排序的部分查询是:

然而问题在于,在其当前状态下,psql 返回按两个集群排序的人员列表:大写和小写。ASC 排序返回大写排序 + 小写排序,而 DESC 返回反向排序小写 + 反向排序大写。

以无案例顺序对数据进行排序是否有技巧,或者数据是否需要最初存储在特定案例中。

这确实创建了一个临时修复,但如果有其他方法我会很高兴

0 投票
1 回答
816 浏览

postgresql - 在 postgres 中查询一个 jsonb 数组

桌子:

插入语句:

我正在尝试查询 postgres 中的 jsonb 数组类型列。我手头有一些解决方案,如下所示。不知何故它不起作用错误是 - Cannot extract elements from a scalar

更新:查询运行得很好。对于其他一些行,列中有一些不需要的值,因此它没有运行。

0 投票
1 回答
23737 浏览

sql - 使用 JSONB 列中的值连接表

有两个表:

授权联系人 ( auth_contacts):

contacts包含具有属性的联系人数组{contact_id, type}

discussion

该表auth_contacts至少有 100k 条记录,因此它不是 JSONB 类型是不合适的,因为它会使记录量增加一倍或三倍。

样本数据auth_contacts

discussion表有 500 万条奇数记录。

我想加入discussion.contact_id(关系列)与联系人 id,其中 json 对象数组中的 json 对象auth_contacts.contacts

一种非常粗暴的方法是:

这实际上是在运行时创建(内部 sql)用户 ID 与联系人 ID 表(这是我所避免的,因此使用 JSONB 数据类型对于具有大量记录的用户的此查询需要 26 + 秒,这并不是很好。试过其他一些方法:PostgreSQL 9.4:在数组内的 JSON 字段 id 上聚合/连接表

但是应该有一种更清洁、更好的方法,就像 JOIN 一样简单d.contact_id = contacts -> contact -> contact_id? 当我尝试这个时,它不会产生任何结果。

在网上搜索时,这似乎是一项相当繁琐的任务?

0 投票
2 回答
654 浏览

sql - How do I include rows that don't meet the criteria?

I know I'm probably just thinking about this wrong. I have the following structure:

And the following data:

I'm trying to return all the employees and the "value" of their sales in 2012. If there is no sales in 2012 then return "No Data". I have:

I get:

The value is wrong for 'Rob'. It should be 'No Data'. (I am using 0 as the 2nd parameter for coalesce as I get an error "invalid input syntax for type double precision: 'No Data'"

0 投票
1 回答
2908 浏览

ruby-on-rails - 使用 Active Record (Rails 4/postgresql9.4) 查询 json 数组

我有一个 Deal 模型,它有一个名为“info”的属性,其结构如下:

在交易的“信息”栏内:

该列在 mligration 中定义为 json

如何使用活动记录在 jsonb 中查询这个?

  • 查找 infos 至少包含一个 deal_id = 4 的所有交易

  • 找到所有的交易,其中 infos 至少包含一个带有名为“image1”的键的 json 块({})(它应该只输出 Deal1,而不是 deal2)

0 投票
0 回答
3066 浏览

java - 带有 JAVA 的 JSONB PostgreSQL 数据类型 - 插入和连接

第一次尝试 JSONB 数据类型(根据@Erwin 的建议,从(使用 JSONB 列中的值连接表)继续讨论,开始新线程)

两个表(混淆数据和表名):

1-首先,通过Java JDBC在数据库中插入:我正在做的是:

现在,toJSONString() 需要时间(有时长达 1 秒 - toJSON STRING LOOP:17238ms 的时间),这又是低效的。那么这又是正确的方法吗?google 上的大多数示例都直接插入了一个字符串。

如果我直接将 MAP 插入 jsonb coolumn ,它需要一个 HSTORE 扩展,如果我要使用 jsonb,我不应该使用它吗?

2-现在在下一部分:我需要将讨论表中的contact_id与auth_contacts json数据类型的contact_id [如上例所示的关键]并用讨论表的group_id加入auth_groups的group_id

截至目前,仅在contact_id上尝试加入:

对于拥有大约 60,000 个授权联系人的用户,此加入大约需要 60 毫秒,并且连续运行更少 - 混淆解释计划如下:

我的最终目标是使用 group_id 在同一个查询中额外加入。jsonb_object_keys 所做的实际上是为每个键创建一个 userid vs authcontacts 映射。因此,对于拥有 6 万联系人的用户,它将创建一个包含 6 万行的视图(可能在内存中)。现在,如果我在 auth_groups 上加入 join (对于具有 6 万联系人的示例用户,它将有大约 100 万个组,这会使查询变慢。

那么这是加入 jsonb 对象的正确方法吗?有更好的方法吗?

0 投票
2 回答
813 浏览

sql - 如何从我的数据中返回 jsonb 数组和对象数组?

我有下表:

使用以下数据:

请注意,除了“sales_tv”和“sales_radio”之外,还有其他键。对于下面的查询,我只需要关注“sales_tv”和“sales_radio”。

我需要找到 Jim 2012 年的所有销售额。任何以“sales_”开头的东西,然后把它放在一个对象中(只需要销售的产品是什么和价值)。例如:

我有:

但我似乎连吉姆的数据都得不到。相反,我得到: