有没有一种方法可以对jsonb对象中的值列表应用条件?

乔希

目前,我在PostgreSQL表中有一个jsonb列,该列存储格式为json的对象

{
  "subscriptions": {
    "subscription1": {
      "subscribed": boolean
    },
    "subscription2": {
      "subscribed": boolean
    }
  }
}

可以有任意数量的subscription1 / 2 / etc。在文档中,所有名称都不同。我正在尝试查找文档是否包含我具有的每种订阅类型的subscriptions.subscription1.subscribed == true等。

我有一个需要查询的订阅密钥列表,所以我的第一个直觉是遍历它们,并查询数据库以获取这些计数:

subscriptionsKeys.forEach { subscription ->
    // find number of users where `subscription` == true
    val queryResult = repository.getNumberOfUsersSubscribed(subscription)

    // queryResult contains the number of users subscribed to `subscription`
}

其中getNumberOfUsersSubscribed()定义为:

@SqlQuery(
    """
    SELECT count(*) as number_of_users FROM table
    WHERE jsonb_extract_path_text(body,'subscriptions',:subscriptionKey,'subscribed') = 'true'
    """
)
fun getNumberOfUsersSubscribedToOptOutList(
    subscriptionKey: String
): Int

这很好用,但是对于大量订阅,这意味着我将在表上进行ncount(*),这在我们的生产环境中有60多个查询,每个查询处理4500万条以上的记录。

我希望可以通过某种方式构造一个SQL / jsonb查询,该查询允许我传递键的列表/数组['subscription1','subscription2'等”,从而将上述 = true条件应用于每个输入列表行,然后以以下示例格式返回结果:

+------------------------------------+
| subscription_key | number_of_users |
+------------------+-----------------+
| subscription1    | 6               |
| subscription2    | 59              |
| etc.             | n               |
+------------------+-----------------+

任何意见,将不胜感激!

迈克·欧根尼克

只要您的库允许您将数组传递到text[]占位符,那么它就应该起作用。虽然不会特别快,但是应该比您已经使用的方法快。

with yourtable (id, body) as (
  values (1, '{
  "subscriptions": {
    "subscription1": {
      "subscribed": true
    },
    "subscription2": {
      "subscribed": true
    }
  }
}'::jsonb)
), search_terms as (
  select * 
    from unnest(array['subscription1', 'subscription2']) as st(term)
)
select st.term, count(*) 
  from yourtable y
       cross join lateral jsonb_each(y.body->'subscriptions') as b(k, v)
       join search_terms st 
         on st.term = b.k
        and b.v->>'subscribed' = 'true'
 group by st.term
;

┌───────────────┬───────┐
│     term      │ count │
├───────────────┼───────┤
│ subscription1 │     1 │
│ subscription2 │     1 │
└───────────────┴───────┘
(2 rows)

根据您的评论,以防万一您希望统计未明确显示subscribed为的订阅false

with yourtable (id, body) as (
  values (1, '{
  "subscriptions": {
    "subscription1": {
      "subscribed": true
    },
    "subscription2": {
      "subscribed": true
    },
    "subscription3": {
      "subscribed": false
    }
  }
}'::jsonb),
        (2, '{
  "subscriptions": {
    "subscription1": {
      "subscribed": true
    },
    "subscription2": {
      "subscribed": true
    },
    "subscription3": {
      "subscribed": false
    }
  }
}'::jsonb),
        (3, '{}'::jsonb)
), search_terms as (
  select * 
    from unnest(array['subscription1', 'subscription2', 'subscription3', 'subscription4']) as st(term)
)
select st.term, 
       count(*) 
         filter (where 
           coalesce(
             body->'subscriptions'
               ->st.term 
               ->>'subscribed', ''
           ) != 'false')
  from yourtable t
       cross join search_terms st
 group by st.term
 order by st.term
;

┌───────────────┬───────┐
│     term      │ count │
├───────────────┼───────┤
│ subscription1 │     3 │
│ subscription2 │     3 │
│ subscription3 │     1 │
│ subscription4 │     3 │
└───────────────┴───────┘
(4 rows)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以对行的值求和?

来自分类Dev

有没有一种方法可以对列中具有共同值的数据求平均?

来自分类Dev

有没有一种方法可以对列表中的颜色元素进行排序(C#)?

来自分类Dev

有没有一种方法或内置的R函数可以对列表中重复名称的值求和?

来自分类Dev

有没有一种方法可以对多个对象进行一次锤击事件?

来自分类Dev

有没有一种方法可以对符合特定条件的重复行进行计数?

来自分类Dev

有没有一种方法可以使Python列表需要某个对象?

来自分类Dev

空手道:有没有一种方法可以对示例应用函数:变量?

来自分类Dev

有没有一种方法可以对任务栏上的应用程序进行分组?

来自分类Dev

f#中有没有一种方法可以对列表执行交叉操作?

来自分类Dev

有没有一种方法可以访问对象中的对象?

来自分类Dev

有没有一种方法可以同时设置对象的值和属性?

来自分类Dev

有没有一种方法可以根据先前号码的条件来删除列表中的号码?

来自分类Dev

有没有一种方法可以对列表中的所有内容(除了最后一个元素)执行相同的操作?

来自分类Dev

有没有一种方法可以对类中的所有成员使用`std :: optional`

来自分类Dev

有没有一种方法可以将对象中的值映射到javascript中数组的索引?

来自分类Dev

有没有一种方法可以对宏进行计数?

来自分类Dev

有没有一种方法可以对子数组的张量进行排序?

来自分类Dev

有没有一种方法可以对拆分的数组进行排序?

来自分类Dev

有没有一种方法可以对Pascal中的多个按钮使用一个过程?

来自分类Dev

有没有一种方法可以在Java中创建条件比较器?

来自分类Dev

有没有一种方法可以根据事物在列表中的位置为事物分配值?

来自分类Dev

有没有一种方法可以通过IN列表中的值限制查询结果?

来自分类Dev

有没有一种方法可以从包含特定值的对象中查找()随机元素

来自分类Dev

有没有一种方法可以kubectl应用目录中的每个文件?

来自分类Dev

有没有一种方法可以在Ubuntu中“屏蔽”应用程序?

来自分类Dev

Erlydtl:有没有一种方法可以渲染模板中的记录列表?

来自分类Dev

有没有一种方法可以刷新VSCode中的任务列表?

来自分类Dev

有没有一种方法可以合并R中的回归摘要列表?

Related 相关文章

  1. 1

    有没有一种方法可以对行的值求和?

  2. 2

    有没有一种方法可以对列中具有共同值的数据求平均?

  3. 3

    有没有一种方法可以对列表中的颜色元素进行排序(C#)?

  4. 4

    有没有一种方法或内置的R函数可以对列表中重复名称的值求和?

  5. 5

    有没有一种方法可以对多个对象进行一次锤击事件?

  6. 6

    有没有一种方法可以对符合特定条件的重复行进行计数?

  7. 7

    有没有一种方法可以使Python列表需要某个对象?

  8. 8

    空手道:有没有一种方法可以对示例应用函数:变量?

  9. 9

    有没有一种方法可以对任务栏上的应用程序进行分组?

  10. 10

    f#中有没有一种方法可以对列表执行交叉操作?

  11. 11

    有没有一种方法可以访问对象中的对象?

  12. 12

    有没有一种方法可以同时设置对象的值和属性?

  13. 13

    有没有一种方法可以根据先前号码的条件来删除列表中的号码?

  14. 14

    有没有一种方法可以对列表中的所有内容(除了最后一个元素)执行相同的操作?

  15. 15

    有没有一种方法可以对类中的所有成员使用`std :: optional`

  16. 16

    有没有一种方法可以将对象中的值映射到javascript中数组的索引?

  17. 17

    有没有一种方法可以对宏进行计数?

  18. 18

    有没有一种方法可以对子数组的张量进行排序?

  19. 19

    有没有一种方法可以对拆分的数组进行排序?

  20. 20

    有没有一种方法可以对Pascal中的多个按钮使用一个过程?

  21. 21

    有没有一种方法可以在Java中创建条件比较器?

  22. 22

    有没有一种方法可以根据事物在列表中的位置为事物分配值?

  23. 23

    有没有一种方法可以通过IN列表中的值限制查询结果?

  24. 24

    有没有一种方法可以从包含特定值的对象中查找()随机元素

  25. 25

    有没有一种方法可以kubectl应用目录中的每个文件?

  26. 26

    有没有一种方法可以在Ubuntu中“屏蔽”应用程序?

  27. 27

    Erlydtl:有没有一种方法可以渲染模板中的记录列表?

  28. 28

    有没有一种方法可以刷新VSCode中的任务列表?

  29. 29

    有没有一种方法可以合并R中的回归摘要列表?

热门标签

归档