【发布时间】:2020-09-18 20:07:20
【问题描述】:
目前,我在 PostgreSQL 表中有一个 jsonb 列,它存储格式为 json 的对象
{
"subscriptions": {
"subscription1": {
"subscribed": boolean
},
"subscription2": {
"subscribed": boolean
}
}
}
可以有任意数量的订阅1/2/等。在文档中,都具有不同的名称。我正在尝试找出文档是否包含我拥有的每种订阅类型的 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
这很好,但是对于大量订阅,这意味着我将在表上执行 count(*) n 次,在我们的生产环境中超过 60 次查询每个都处理超过 4500 万条记录。
我希望有某种方法可以构造一个 SQL/jsonb 查询,允许我传入一个键列表/数组 ['subscription1','subscription2',etc] 将应用上述 = true 条件针对每一行的输入列表,然后以以下示例格式返回结果:
+------------------------------------+
| subscription_key | number_of_users |
+------------------+-----------------+
| subscription1 | 6 |
| subscription2 | 59 |
| etc. | n |
+------------------+-----------------+
任何建议将不胜感激!
【问题讨论】:
标签: sql postgresql kotlin