在分组期间根据条件组合结果

问题描述 投票:0回答:3

Mongo查询生成的java代码:

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

字段'result'可以包含Approved,Rejected,null和“”(空字符串)等值。我想要实现的是将null和empty的计数结合在一起。

enter image description here

这样空字符串Id将具有null和“”的计数,它等于4

mongodb mongodb-query mongo-java
3个回答
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个文件顶部,我不觉得这样做太糟糕了。


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
}]
}

0
投票

通过以下方式更改组解决了问题

{
    "$group": {
        "_id": {
            "$ifNull": ["$result", ""]
        },
        "id": {
            "$first": "$result"
        },
        "labelKey": {
            "$first": {
                "$ifNull": ["$result",
                "$result"]
            }
        },
        "value": {
            "$sum": 1
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.