【问题标题】:How to search by exact hash in Rails ActiveRecord for JSON MySql field?如何在 Rails ActiveRecord 中通过精确哈希搜索 JSON MySql 字段?
【发布时间】:2021-11-15 10:18:08
【问题描述】:

我在 MySQL 数据库中有一个带有 json 类型的字段。该字段包含诸如

之类的值
{
    "city_eq": "NewYork",
    "rent_true": false,
    "estate_type_eq": 0
}

通过传入哈希搜索记录的正确方法是什么?像这样:

Link.where(json_fields: {
    "city_eq": "NewYork",
    "rent_true": false,
    "estate_type_eq": 0
})

只有当所有值都相同并显示在字段中时,查询才应返回记录。哈希键的顺序可能不同。

【问题讨论】:

  • 您需要检查数据库的文档并使用 SQL 字符串。 ActiveRecord 不会自动从散列创建对 JSON/JSONB 等类型的查询。或者您可以重新考虑是否真的想使用 JSON 列而不是表...
  • @max 可以使用原始sql
  • 是的。如果您无法使用 ActiveRecord 查询接口创建给定查询,请使用 SQL 字符串或 Arel。查询接口适用于大多数简单查询,但不涵盖数据库特定功能,例如未标准化的 JSON 列。
  • @max 我的意思是从 AA 切换到原始 SQL 并不是什么大问题。问题是我无法构建正确的 SQL :)

标签: mysql sql ruby-on-rails mysql-json


【解决方案1】:

这是一个与您显示的 JSON 数据相匹配的 SQL 搜索演示:

mysql> create table mytable (json_fields json);
Query OK, 0 rows affected (0.05 sec)

mysql> insert into mytable values ('{
    '>     "city_eq": "NewYork",
    '>     "rent_true": false,
    '>     "estate_type_eq": 0
    '> }');
Query OK, 1 row affected (0.02 sec)

mysql> select * from mytable where json_contains(json_fields,
       json_object('city_eq', 'NewYork', 'rent_true', false, 'estate_type_eq', 0));
+-----------------------------------------------------------------+
| json_fields                                                     |
+-----------------------------------------------------------------+
| {"city_eq": "NewYork", "rent_true": false, "estate_type_eq": 0} |
+-----------------------------------------------------------------+

但是,以这种方式搜索 JSON 必然会导致表扫描。如果您想以优化的方式搜索数据,我建议您不要将数据存储在 JSON 中。

【讨论】:

  • 这就是我要找的。将参数传递给json_object 方法是多么有趣的方式。谢谢。
  • subway_id_in: [23]这样的数组类型字段呢?
猜你喜欢
  • 2011-01-15
  • 2017-02-15
  • 2012-11-15
  • 2014-01-04
  • 1970-01-01
  • 2011-09-02
  • 2016-10-21
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多