我试图通过pymongo从MongoDB查询不同的文档,并按特定字段对它们进行分组。分组部分工作得非常好,但是我有一个具有布尔值(True,False)的字段,但是它通常在单独的分组中保留文档为True和文档为False。
例如:
doc1{boolean : True, ... ... ..., count = 20}
doc2{boolean : False, ... ... ..., count = 10}
但我需要它将它分组:
doc{boolTrue : 20, boolFalse, 10, ... ... ..., count = 30}
因此它不会通过布尔字段分隔文档。
我尝试做类似的事情,但是提议的(见下文)解决方案都没有起作用:
"$group": {
"_id": {
"succTrue": {"$sum": {"$cond": [{"$client.succeeded": "True"}, 1, 0]}},
"succFalse": {"$cond": [{"$client.succeeded": "False"}, 1, 0]},
}
}
PS:还有其他领域,但它们与问题无关。
E:实际文件看起来像这样:
{
"sType" : "Client",
"succeeded" : false,
"sVer" : "v1"
}
预期产出:
{
countSucceededTrue: 15,
countSucceededFalse: 5,
"sType" : "Client",
"sVer" : "v1"
},
{
countSucceededTrue: 5,
countSucceededFalse: 13,
"sType" : "Client",
"sVer" : "v2"
}
{
countSucceededTrue: 3,
countSucceededFalse: 2,
"sType" : "Client",
"sVer" : "v3"
}
答案 0 :(得分:1)
你想要你的"分组键"在_id
字段中,以及$sum
累加器下的其他条件:
collection.aggregate([
{ "$group": {
"_id": { "sType": "$sType", "sVer": "$sVer" },
"countSucceededTrue": { "$sum": { "$cond": [ "$succeeded", 1, 0 ] } },
"countSucceededFalse": { "$sum": { "$cond": [ "$succeeded", 0, 1 ] } }
}}
])
"分组键"当然是嵌套的,但你应该习惯这个概念。可以使用$project
重新命名字段来执行另一次传递,但是费用贯穿所有结果,而不仅仅是接受它们嵌套在_id
中:
collection.aggregate([
{ "$group": {
"_id": { "sType": "$sType", "sVer": "$sVer" },
"countSucceededTrue": { "$sum": { "$cond": [ "$succeeded", 1, 0 ] } },
"countSucceededFalse": { "$sum": { "$cond": [ "$succeeded", 0, 1 ] } }
}},
{ "$project": {
"sType": "$_id.sType",
"sVer": "$_id.sVer",
"countSucceededTrue": 1,
"countSucceededFalse": 1
}}
])
$cond
是"ternary",所以第一个条件" if"在逻辑上是真的(并且它已经是一个布尔值)"然后"使用第二个参数" else"使用第三个的值。这提供了"计数"到$sum
累加器。