我收藏了大约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 } ) ...
我觉得,这不是正确的方法,请给我一些建议,如何在一个查询中获取此信息。
答案 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" } }
])