我的MongoDB数据库有一个结构
{ "_id" : ObjectId("5c1ccc20fc0f60769227d455"), "type" : 0, "id" : "hwJyzAHyfjXUlrGhblT7txWd", "userowner" : 1.0, "campid" : "9548", "date" : 1545391136, "useragent" : "mozilla/5.0 (windows nt 10.0; win64; x64; rv:65.0) gecko/20100101 firefox/65.0", "domain" : "", "referer" : "", "country" : "en", "language" : "en-US", "languages" : [ "en-US", "en" ], "screenres" : [ "1920*1080" ], "avscreenres" : [ "1080*1858" ], "webgl" : "angle (nvidia geforce gtx 1060 6gb direct3d11 vs_5_0 ps_5_0)", "hash" : 123, "timezone" : -180, "result" : true, "resultreason" : "learning", "remoteip" : "0.0.0.0" }
每个a文档都有一个带有bool值vield“result”。我进行聚合选择:
db.getCollection('clicks').aggregate([ { $match: {userowner: 1, date:{$gte: 0, $lte: 9545392055}} }, { $group : {_id : "$campid", number: {$sum: 1}}} ])
并得到一个结果:
/* 1 */ { "_id" : "4587", "number" : 2.0 } /* 2 */ { "_id" : "9548", "number" : 1346.0 }
如何计算字段“result”中值“true”和“false”的数量,并得到如下结果:
/* 1 */ { "_id" : "4587", "number" : 2.0, "passed":100, "blocked":120 } /* 2 */ { "_id" : "9548", "number" : 1346.0, "passed":100, "blocked":120 }
我希望这能按照你的要求工作。
db.getCollection('clicks').aggregate(
[
{
$match: {
userowner: 1, date: {
$gte: 0, $lte: 9545392055
}
}
},
{
$group: {
_id: "$campid", passed: {
$sum: {
$cond:
[
{ $eq: ["$result", true] },
1, 0
]
}
},
blocked: {
$sum: {
$cond:
[
{
$eq: ["$result", false]
}
, 1, 0]
}
},
number: { $sum: 1 }
}
},
{
$project: {
_id: 0,
campid: "$_id",
number: 1,
passed: 1,
blocked: 1
}
}
])
输出:-
{
"passed" : 3,
"blocked" : 2,
"number" : 5,
"campid" : "4587"
}
{
"passed" : 2,
"blocked" : 1,
"number" : 3,
"campid" : "9548"
}
有关更多信息,请参阅$GROUP、$COND和$EQ。