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

时间:2015-11-21 12:13:36

标签: mongodb mongoose mongodb-query

我收藏了大约50000份文件。 Collections Schema看起来像这样:

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

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

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

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

1 个答案:

答案 0 :(得分:0)

通过 aggregation framework 一次性完成。

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

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

import numpy as np
X=np.array[a,b,c,d,e,f,g]
F=np.zeros_like(X)
for i,f in enumerate(F):
    f = sum(np.delete(i,F))**2+X[i]

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

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