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