2016-05-26 4 views
2

У меня есть коллекция MongoDB как этотMongoDB GroupBy

{ 
    "_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, 
     } 
    ] 
} 

Как я могу идти об этом ?

ответ

2

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

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

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

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 
+0

Благодаря он работал. также если я хочу весь объект, я должен передать каждый ключ в $ cond или есть какой-либо вариант для этого – sumair

+0

Вы можете выбрать ['' $$ ROOT "'] (https://docs.mongodb.com/v3.0 /reference/aggregation-variables/#variable.ROOT) системная переменная '' $ cond ": [ {" $ eq ": [" $ stage ", 20]}, $$ ROOT, false ]' но будет лично не рекомендуйте его, так как он должен использоваться, если итоговые документы не должны превышать [Размер документа для размера BSON] (https://docs.mongodb.com/v3.0/reference/limits/#BSON-Document-Size). – chridam

Смежные вопросы