【问题标题】:How to get multi matching filters count in mongoDB如何在 mongoDB 中获取多个匹配的过滤器计数
【发布时间】:2016-02-23 21:58:33
【问题描述】:

我收集了大约 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 mongoose mongodb-query


    【解决方案1】:

    很可能通过 aggregation framework 一口气完成。

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

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

    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$replaceRoot 运算符的 MongoDB 版本,您需要在组管道中显式指定字段计算总和:

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

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2021-09-23
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多