JSONB嵌套查询postgres rails

时间:2019-01-06 09:11:55

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

我有一个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。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

发布一种可能的方法之前的一件事:请注意,这在性能方面将是非常糟糕的,因为这始终需要您进行全表扫描。具有比我更多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