首页 > 解决方案 > 在分组期间根据条件组合结果

问题描述

从 java 代码生成的 Mongo 查询:

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

字段“结果”可以具有 Approved、Rejected、null 和“”(空字符串)等值。我想要实现的是将 null 和 empty 的计数结合在一起。

在此处输入图像描述

这样空字符串Id就会有null和""的计数,等于4

标签: mongodbmongodb-querymongo-java

解决方案


我确信有一种更“正确”的方式,但这是我可以很快想到的:

    [
        { 
            "$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 个文档上,我对此并不感到太糟糕。


推荐阅读