我有以下疑问。
//returns total where field callback exist and not empty
db.parts.find({callback:{"$exists" : true, "$ne" : ""}}).count();
//returns total where field callback exist and empty
db.parts.find({callback:{"$exists" : true, "$in" : [""]}}).count();
//returns total where field callback doesn't exist
db.parts.find({callback:{"$exists" : false}}).count();
我想构造一个返回数组中所有三个计数的查询,如下所示。
{ "callbacks" : sum, "emptycallbacks" : sum, "missingcallbacks": sum }
感谢。
答案 0 :(得分:1)
aggregation framework正是您在这里寻找的。您主要从$cond
管道中的$group
运算符获得结果:
db.parts.aggregate([
{ "$group": {
"_id": null,
"callbacks": {
"$sum": {
"$cond": [
{ "$ne": [{ "$ifNull": ["$callback",""]}, "" ] },
1,
0
]
}
},
"emptycallbacks": {
"$sum": {
"$cond": [
{ "$eq": [ "$callback", "" ] },
1,
0
]
}
},
"missingcallbacks": {
"$sum": {
"$cond": [
{"$ifNull": [ "$callback", false ] },
0,
1
]
}
}
}}
])
每个都使用不同的comparison operators,但主要是$ifNull
来测试文档中是否存在该字段。由于$cond
是三元运算符,因此从条件分别为true
或false
的位置评估第二个和第三个参数。
将这些值传递给$sum
运算符以将其添加。 null
作为分组键意味着将所有内容添加到集合中,而不对特定字段值进行“分组”。
鉴于以下文件:
{ "callback" : "a" }
{ "callback" : "" }
{ "other" : "a" }
{ "callback" : "" }
{ "something" : "a" }
{ "else": "a" }
结果是:
{ "_id" : null, "callbacks" : 1, "emptycallbacks" : 2, "missingcallbacks" : 3 }
显示所有条件都正确计数。
您可能需要为实际文档扩展该逻辑,但这是一般方向。