【问题标题】:JSONB nested query postgres railsJSONB 嵌套查询 postgres rails
【发布时间】:2019-01-06 09:11:54
【问题描述】:

我有一个 jsonb 列,用于存储一些过滤数据。我在列中存储数据的结构如下所示,

[
      {
        "filter":[
            {
                "key":"first_name",
                "condition":"has_any_value"
            },
            {
                "key":"count_of",
                "value":"1",
                "event_id":"130",
            }
        ]
     },
     {
        "filter":[
            {
                "key":"count_of",
                "value":"1",
                "event_id":"130"
            }
        ],
        "filter_operator":"AND"
     },
     {
        "filter":[
            {
                "key":"user_id",
                "value":"12",
                "condition":"equals"
            },
            {
                "key":"count_of",
                "value":"112",
                "event_id":"130"
        ],
        "filter_operator":"OR"
     }
]

我需要查询过滤器 JSON 是否包含特定事件 ID(可能存在于任何“filter”数据中),但我找不到查询特定事件 ID 是否存在于结构中的方法我有(数组 -> 每个filter 数据 -> 任何哈希都可能包含事件 ID)。我正在使用 postgres 10.1。任何人都可以帮助得到这个吗?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord ruby-on-rails-5


    【解决方案1】:

    在发布可能的方法之前有一点:请注意,这在性能方面会非常糟糕,因为这总是需要您进行全表扫描。可能比我有更多 DBA 经验的人知道在此处添加索引的巧妙方法,但就可维护性而言,采用稍微不同的方法可能仍然更好。

    话虽如此,这是我的方法。

    with filters as (
      select id, jsonb_array_elements(
        jsonb_array_elements(my_jsonb_column)->'filter') as filter
        from my_table
    )
    select distinct id from filters where filter @> '{"event_id":"130"}'::jsonb
    

    这将为您提供所有记录的 ID,包括事件 ID。

    这是一个演示它的小提琴:https://www.db-fiddle.com/f/hMSjM675cqQQnb734V4zne/0

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2017-01-28
      • 2023-04-03
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多