gpt4 book ai didi

mongodb - 如何在 mongoDB 中获取多个匹配的过滤器计数

转载 作者:行者123 更新时间:2023-12-05 06:43:23 26 4
gpt4 key购买 nike

我收集了大约 50000 份文件。集合架构如下所示:

{ param1: Boolean, param2: Boolean, param3: Boolean, param4: Boolean } //etc

我应该如何查询数据库,以获得每个匹配的参数计数。目前,我正在循环调用每个参数:

db.getCollection('patients').count({ param1: true } )
db.getCollection('patients').count({ param2: true } )
db.getCollection('patients').count({ param3: true } ) ...

我觉得,这不是正确的方法,请给我一些建议,如何在一个查询中获取这些信息。

最佳答案

通过 aggregation framework 一次完成非常有可能

使用 MongoDb 3.6 和更新版本,您可以利用 $arrayToObject $replaceRoot 中的 运算符 管道以获得所需的结果。

在管道中,利用 $cond $group 中的运算符阶段根据参数字段 bool 值评估计数,如下所示:

db.getCollection('patients').aggregate([ 
{ "$project": { "_id": 0 } },
{ "$project": { "data": { "$objectToArray": "$$ROOT" } } },
{ "$unwind": "$data" },
{ "$group": {
"_id": "$data.k",
"count": {
"$sum": {
"$cond": [ "$data.v", 1, 0 ]
}
}
} },
{ "$group": {
"_id": null,
"counts": {
"$push": { "k": "$_id", "v": "$count" }
}
} },
{ "$project": {
"data": { "$arrayToObject": "$counts" }
} },
{ "$replaceRoot": { "newRoot": "$data" } }
])

对于不支持上述 $arrayToObject 的MongoDB版本 $replaceRoot 运算符,您需要在计算总和时明确指定组管道中的字段:

db.getCollection('patients').aggregate([    
{ "$group": {
"_id": null,
"param1_count": {
"$sum": {
"$cond": [ "$param1", 1, 0 ] /* similar to "$cond": [ { "$eq": [ "$param1", true ] }, 1, 0 ] */
}
},
"param2_count": {
"$sum": {
"$cond": [ "$param2", 1, 0 ]
}
},
"param3_count": {
"$sum": {
"$cond": [ "$param3", 1, 0 ]
}
},
"param4_count": {
"$sum": {
"$cond": [ "$param4", 1, 0 ]
}
}
} },
{ "$project": {
"_id": 0,
"param_counts": {
"param1": "$param1_count",
"param2": "$param2_count",
"param3": "$param3_count",
"param4": "$param4_count"
}
} }
])

关于mongodb - 如何在 mongoDB 中获取多个匹配的过滤器计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33843197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com