MongoDB GroupBy

У меня есть коллекция mongoDB, как это

{ 
    "_id" : "EkKTRrpH4FY9AuRLj",
    "stage" : 10,
},
{ 
    "_id" : "EkKTRrpH4FY9AuRLj",
    "stage" : 10,
},
{ 
    "_id" : "EkKTRrpH4FY9AuRLj",
    "stage" : 20,
}

И я хочу сгруппировать его в

stage: 10 in paid 
stage: 20 in unpaid 

Результат должен выглядеть так

{
    "paid": [
        { 
            "_id" : "EkKTRrpH4FY9AuRLj",
            "stage" : 10,
        },
        { 
            "_id" : "EkKTRrpH4FY9AuRLj",
            "stage" : 10,
        }
    ],
    "unpaid": [
        { 
            "_id" : "EkKTRrpH4FY9AuRLj",
            "stage" : 20,
        }
    ]
}

Как я могу пойти по этому поводу?

1 ответ

Решение

Предложил бы использовать структуру агрегации для этого, где вам нужно будет запустить начальный $group постановочный конвейер, который использует операторы $push создать новые массивы, и $cond оценить некоторые условия и использовать логику для встраивания правильных документов.

Финал $project шаг конвейера необходим для удаления некоторых элементов массива из предыдущего конвейера, которые являются избыточными, т.е. отфильтровывают [ложные] значения с помощью $setDifference оператор.

Подумайте о запуске следующего конвейера агрегации, который показывает вышеуказанное в оболочке mongo:

db.collection.aggregate([
    {
        "$group": {
            "_id": null,
            "paid": {
                "$push": {
                    "$cond": [ 
                        { "$eq": [ "$stage", 10 ] }, 
                        { "_id": "$_id", "stage": "$stage" }, 
                        false
                    ]
                }
            },
            "unpaid": {
                "$push": {
                    "$cond": [ 
                        { "$eq": [ "$stage", 20 ] }, 
                        { "_id": "$_id", "stage": "$stage" }, 
                        false
                    ]
                }
            }
        }
    },
    {
        "$project": {
            "_id": 0,
            "paid": {
                "$setDifference": [ "$paid", [false] ]
            },
            "unpaid": {
                "$setDifference": [ "$unpaid", [false] ]
            }
        }
    }
])

Добавить meteorhacks:aggregate пакет, который выставляет .aggregate() метод на экземплярах Mongo.Collection. Обратите внимание, что это работает только на стороне сервера, и там нет встроенной поддержки или реактивности.

Добавить в свое приложение с

meteor add meteorhacks:aggregate
Другие вопросы по тегам