0

Ich habe eine Sammlung von Projekten in denen Projekte wie diese sind:MongoDB Gruppe nach Feld und Zeige Array von gruppierten Elementen?

{ 
    "_id" : ObjectId("57e3e55c638cb8b971"), 
    "allocInvestor" : "Example Investor", 
    "fieldFoo" : "foo bar", 
    "name" : "GTP 3 (Roof Lease)" 
} 

Ich möchte eine Liste von Projekten, die von allocInvestor Feld und nur zeigen Felder gruppiert erhalten: name und id

Wenn ich Aggregat und $ Gruppe wie folgt aus:

db.getCollection('projects').aggregate([ 
    {"$group" : { 
        _id:"$allocInvestor", count:{$sum:1} 
       } 
    } 
]) 

ich erhalte eine Anzahl von Projekt pro allocInvestor aber ich brauche, ist die Liste der allocInvestor mit Sub-Array von proje zu erhalten cts pro AllocInvestor.

Ich benutze übrigens Meteor, falls das hilft. Aber ich möchte zuerst die Abfrage direkt auf mongodb dann versuchen für Meteor.

Antwort

0

Sie können $ push oder $ addToSet verwenden, um eine Liste mit Namen und _id für jede Gruppe zu erstellen. $ push erlaubt Duplikate und $ addToSet fügt der Liste kein Element hinzu, wenn es bereits vorhanden ist.

db.getCollection('projects').aggregate([ 
              { "$group" : { _id : "$allocInvestor", 
                  count : {$sum : 1}, 
                  "idList" : {"$addToSet" : "$_id"}, 
                  "nameList" : {"$addToSet":"$name"} 
                 }  
              } 
            ]); 

Um den Namen und _id Daten in einer einzigen Liste zu erhalten:

db.getCollection('projects').aggregate([ 
              { "$group" : { _id : "$allocInvestor", "projects" : {"$addToSet" : {id : "$_id", name: "$name"}}}}, 
              {"$project" : {"_id" : 0, allocInvestor : "$_id", "projects" : 1 }} 
             ]); 
+0

ist es trotzdem eine Liste zurück, wie zu erhalten: {allocInvestor: alloc1, Projekte: [{id: "1", name: "proj1"}, {id: 2, Name: "proj2"} ], allocInvestor: alloc2, Projekte: [...]} – commonSenseCode

+0

Mr.Easy Answers McFly: Meine Antwort wurde aktualisiert. – 4J41

+0

es heißt 'InternalError: zu viel Rekursion' – commonSenseCode

0

den $$ ROOT-Operator das gesamte Dokument verweisen und dann Projekt verwenden, um die Felder zu beseitigen, die Sie nicht benötigen .

db.projects.aggregate([ 
    {"$group" : { 
        "_id":"$allocInvestor", 
        "projects" : {"$addToSet" : "$$ROOT"} 
       } 
    }, 
    {"$project" : { 
        "_id":0, 
        "allocInvestor":"$_id", 
        "projects._id":1 
        "projects.name":1 
        } 
    } 
]) 
Verwandte Themen