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

2023-12-01

我收集了大约 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 } ) ...

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


很有可能一次性通过聚合框架.

使用 MongoDb 3.6 及更高版本,您可以利用$arrayToObject一个内的运算符$replaceRoot管道以获得所需的结果。

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

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" } } 
])

对于不支持上述功能的 MongoDB 版本$arrayToObject and $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"
        }
    } }
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 mongoDB 中获取多个匹配过滤器计数 的相关文章

随机推荐