组总计有条件地基于字段值

时间:2017-06-04 13:48:00

标签: python mongodb aggregation-framework pymongo

我试图通过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"
}

1 个答案:

答案 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累加器。