我们说我有一个包含测试结果的集合。架构是:
Results {
_id: ObjectId
TestNumber: int
result: String // this contains "pass" or "fail"
// additional data
}
对于每个测试,可以有很多报告,因此每个TestNumber
很可能会出现在多个文档中。
如何执行在整个集合上返回此信息的查询:
TestNumber | count of result == "pass" | count of result == "fail"
答案 0 :(得分:1)
您可以使用以下汇总操作:
Group
所有文件均基于testNumber
及其类型
result
在一起,因此对于每个testNumber,我们都会two
每个分组,一个用于fail
,另一个用于pass
,其数量为。{
每组中的文件。Project
包含结果的组的变量“pass”
传递,而另一组失败。Group
再次根据testNumber汇总文档,以及
将传递和失败文档推送到数组中。Project
字段。守则:
Results.aggregate([
{$group:{"_id":{"testNumber":"$testNumber","result":"$result"},
"count":{$sum:1}}},
{$project:{"_id":0,
"testNumber":"$_id.testNumber",
"result":{$cond:[{$eq:["$_id.result","pass"]},
{"pass":"$count"},
{"fail":"$count"}]}}},
{$group:{"_id":"$testNumber",
"result":{$push:"$result"}}},
{$project:{"testNumber":"$_id","result":1,"_id":0}}
],function(a,b){
// post process
})
示例数据:
db.collection.insert([
{
"_id":1,
"testNumber":1,
"result":"pass"
},
{
"_id":2,
"testNumber":1,
"result":"pass"
},
{
"_id":3,
"testNumber":1,
"result":"fail"
},
{
"_id":4,
"testNumber":2,
"result":"pass"
}])
样本o / p:
{ "result" : [ { "pass" : 1 } ], "testNumber" : 2 }
{ "result" : [ { "fail" : 1 }, { "pass" : 2 } ], "testNumber" : 1 }
迭代doc.result
将为您提供testNumber
的通过次数和失败的测试次数。