根据分组条件合并结果

时间:2019-04-24 13:00:55

标签: mongodb mongodb-query mongo-java

用Java代码生成的Mongo查询:

{ 
    "pipeline": [{
        "$match": {
            "Id": "09cd9a5a-85c5-4948-808b-20a52d92381a"
        }
    },
    {
        "$group": {
            "_id": "$result",
            "id": {
                "$first": "$result"
            },
            "labelKey": {
                "$first": {
                    "$ifNull": ["$result",
                    "$result"]
                }
            },
            "value": {
                "$sum": 1
            }
        }
    }]
}

字段“结果”可以具有“已批准”,“已拒绝”,空值和“”(空字符串)之类的值。我想要实现的是将null和empty的计数组合在一起。

enter image description here

因此空字符串ID的计数将为null和“”,等于4

3 个答案:

答案 0 :(得分:0)

我敢肯定还有一种“适当的”方法,但这是我可以很快想到的:

    [
        { 
            "$group" : {
                "_id" : "$result", 
                "id" : {
                   "$first" : "$result"
                }, 
                "labelKey" : {
                    "$first" : {
                        "$ifNull" : [
                            "$result", 
                            "$result"
                        ]
                    }
                }, 
                "value" : {
                    "$sum" : 1.0
                }
            }
        }, 
        { 
            "$group" : {
                "_id" : {
                    "$cond" : [{
                           $or: [
                              {"$eq": ["$_id", "Approved"]},
                              {"$eq": ["$_id", "Rejected"]},
                           ]}}, 
                        "$_id", 
                        ""
                    ]
                }, 
                "temp" : {
                    "$push" : {
                        "_id" : "$_id", 
                        "labelKey" : "$labelKey"
                    }
                }, 
                "count" : {
                    "$sum" : "$value"
                }
            }
        }, 
        { 
            "$unwind" : "$temp"
        }, 
        { 
            "$project" : {
                "_id" : "$temp._id", 
                "labelKey": "$temp.labelKey",
                "count" : "$count"
            }
        }
    ], 
);

由于第二组仅位于4个文档顶部,因此我对此并不感到难过。

答案 1 :(得分:0)

我用过$facet

MongoDB阶段$ facet允许您在管道阶段中运行多个独立的管道,全部使用相同的数据。这意味着您可以使用相同的初始阶段和连续阶段来运行多个聚合。

  var queries = [{
    "$match": {
        "Id": "09cd9a5a-85c5-4948-808b-20a52d92381a"
    }
  },{
        $facet: {// 
             "empty": [
             {
                $match : {
                    result : { $in : ['',null]}
                }
             },{
                    "$group" : {
                        "_id" : null,
                        value : { $sum : 1}
                    }
             }
            ],
             "non_empty": [
             {
                $match : {
                    result : { $nin : ['',null]}
                }
             },{
                    "$group" : {
                        "_id" : '$result',
                        value : { $sum : 1}
                    }
             }
            ]
         }
     },
     {
      $project: {
       results: {
        $concatArrays: [ "$empty", "$non_empty" ] 
    } 
}
}];

输出:

{
"results": [{
    "_id": null, 
    "value": 52 // count of both '' and null.
}, {
    "_id": "Approved",
    "value": 83
}, {
    "_id": "Rejected",
    "value": 3661
}]
}

答案 2 :(得分:0)

通过如下更改组来解决问题

{
    "$group": {
        "_id": {
            "$ifNull": ["$result", ""]
        },
        "id": {
            "$first": "$result"
        },
        "labelKey": {
            "$first": {
                "$ifNull": ["$result",
                "$result"]
            }
        },
        "value": {
            "$sum": 1
        }
    }
}