Объедините результаты, основанные на условии во время группы, - PullRequest
0 голосов
/ 24 апреля 2019

Запрос Монго, сгенерированный из кода 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 и "" (пустая строка).То, чего я пытаюсь добиться, - это объединить количество как нулевых, так и пустых.

enter image description here

Так что пустой идентификатор строки будет иметь число как ноль, так и "", что равно 4

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Я использовал $ facet .

Этап $ facet MongoDB позволяет вам запускать несколько независимых конвейеров на стадии конвейера, все с использованием одних и тех же данных.Это означает, что вы можете запустить несколько агрегатов с одинаковыми предварительными этапами и последовательными этапами.

  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 голосов
/ 30 апреля 2019

Изменение группы, как показано ниже, решило проблему

{
    "$group": {
        "_id": {
            "$ifNull": ["$result", ""]
        },
        "id": {
            "$first": "$result"
        },
        "labelKey": {
            "$first": {
                "$ifNull": ["$result",
                "$result"]
            }
        },
        "value": {
            "$sum": 1
        }
    }
}
0 голосов
/ 24 апреля 2019

Я уверен, что есть более «правильный» способ, но вот что я мог бы быстро придумать:

    [
        { 
            "$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 вершин документов, я нея чувствую себя слишком плохо из-за этого.

...