2016-05-26 65 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管道步驟是必要的修剪一些來自前管道是冗餘陣列元件的,即通過使用$setDifference操作者濾除[FALSE]值。

考慮運行以下聚合管線,顯示在蒙戈殼以上:

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實例方法。請注意,在服務器端這隻能有無內置oberserving支持或反應。

添加到您的應用

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