【问题标题】:How to query json data with hashes inside array in rails?如何使用rails中数组内的哈希查询json数据?
【发布时间】:2021-01-01 17:54:20
【问题描述】:

我有以下关于 Note 模型的数据集。目前,我正在使用 Postgres 作为数据库。下面是Notes 表上的两条不同记录。

id: 1,
name: 'First Note',
items: [{description: 'First Note'}, {description: 'PM1 Second Note'}]

id: 2,
name: 'Second Note',
items: [{description: 'Second Note'}, {description: 'PM2 Second Note'}]

id: 3,
name: 'Third Note',
items: [{description: 'Third Note'}, {description: 'Invalid Second Note'}]

我如何查询json 字段(项目),以便我在描述字段上获得值PM 的所有注释,即查询应返回上例中id 为1 和2 的注释?

【问题讨论】:

  • 很不清楚你在这里问什么。我们是在谈论存储在数据库中的数据吗?什么rdbms?这是本机 JSON/JSONB 列还是您将序列化与 varchar 列一起使用?请提供架构描述和实际所需输出的示例。
  • Postgresql query array of objects in JSONB field。 ActiveRecord 没有任何用于查询 JSON 列的内置方法,因此您需要编写 SQL 字符串。这将是一个复杂的查询,因为您不能只使用 @> 中内置的 Postgres,包括带有 like/ilike 的运算符。如果它在我那里我会考虑创建一个单独的表而不是使用 JSON 列,因为这样可以让您编写一个更简单的连接查询并使用索引。

标签: ruby-on-rails activerecord


【解决方案1】:

我没有测试,但以下其中一项应该可以工作。

Note.where("items->>'description' iLIKE ?", '%PM%')
# or
Note.where("items::json -> 'description' iLIKE ?", '%PM%')

【讨论】:

  • 感谢 Emu 的回复,但上面的查询似乎没有为我返回任何结果。我正在为数据库使用 Postgres。和上面的查询有什么区别吗?
  • @Codefather 通常这适用于 Postgres:where("items ->> 'description' = ?", variable) 但我从来没有用 LIKE 和 tbh 测试过它我没有在文档中看到它,所以你可能需要使用精确值比较 = , 或 is
【解决方案2】:

使用原始 SQL,您可以通过以下方式实现:

select * from notes,
  json_array_elements(items) element
  where element->>'description' LIKE '%PM%';

使用 activerecord 尝试以下操作:

Note.where("EXISTS (SELECT FROM json_array_elements(items) element WHERE element->>'description' LIKE '%PM%')")

【讨论】:

  • 谢谢伙计。 activerecord 的工作就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2022-11-12
  • 1970-01-01
  • 2016-06-27
  • 2017-08-12
  • 2021-07-12
相关资源
最近更新 更多