2016-11-30 3 views
1

hier ist mein Dokument:einige Fragen über Mongodb.Aggregate variable

members: [ 
    { 
     _id: 'id1' 
     name: 'Jack', 
     group: 0 
    }, 
    { 
     _id: 'id2' 
     name: 'Rose', 
     group: 0 
    }, 
    { 
     _id: 'id3' 
     name: 'Tom', 
     group: 1 
    } 
] 

ich alle Mitglieder jemandes Gruppe und die Gesamtzahl aller Mitglieder von MemberID suchen möchten.

Zum Beispiel, wenn ich Eingang id1, es zurück:

{ 
    count: 3, 
    members: [ 
    { 
     _id: 'id1', 
     name: 'Jack' 
    }, 
    { 
     _id: 'id2', 
     name: 'Rose' 
    } 
    ] 
} 

wenn i Eingang id3, wird es zurück:

{ 
    count: 3, 
    members: [ 
    { 
     _id: 'id3', 
     name: 'Tom' 
    } 
    ] 
} 

Ich habe versucht, dies zu tun:

db.collectionName.aggregate({ 
    $project: { 
    count: {$size: '$members'}, 
    members: 1 
    } 
}, 
{ 
    $unwind: '$members' 
}, 
{ 
    $project: { 
    count: 1, 
    members: { 
     $cond: [{$eq: ['$members._id', TheInputMemberId]}, '$member', null] 
    } 
    } 
}) 

Aber der Filter enthält nur _id nicht _id und group, so ist das Ergebnis immer nur ein Mitglied.

Ich weiß nicht, wie man zuerst die Gruppenvariable bekommt und dann filtert.

Wir freuen uns auf Ihre Antwort! Vielen Dank!

+0

Warum Eingabe ID1 ID2 Mitglied im ersten Beispiel zurückgibt? – Veeram

+0

@Veeram beacuse sie in derselben Gruppe – aweiu

Antwort

1

Sie können so etwas versuchen. Die Projekt- und Gruppenphase wurde hinzugefügt, um die Datenergebnisse beizubehalten, wenn eines der Ergebniselemente mit der übergebenen ID übereinstimmt.

$map gilt ein Gleichheitsvergleich zwischen der ID und ID übergeben in jedem Elementdaten Ergebnis und erzeugt ein Array mit wahren und falschen Werten. $anyElementTrue prüft dieses Array und gibt nur wahr, wenn es atleast einen wahren Wert im Array ist. Übereinstimmungsstufe, um nur Elemente mit dem Übereinstimmungswert von wahr aufzunehmen

aggregate({ 
    "$project": { 
    "count": { 
     "$size": "$members" 
    }, 
    "members": 1 
    } 
}, { 
    "$unwind": "$members" 
}, { 
    "$group": { 
    "_id": "$members.group", 
    "data": { 
     "$push": { 
     "name": "$members.name", 
     "_id": "$members._id" 
     } 
    }, 
    "count": { 
     "$first": "$count" 
    } 
    } 
}, { 
    "$project": { 
    "_id": 1, 
    "data": 1, 
    "matched": { 
     "$anyElementTrue": { 
     "$map": { 
      "input": "$data", 
      "as": "result", 
      "in": { 
      "$eq": ['$$result._id', 'id1'] 
      } 
     } 
     } 
    } 
    } 
}, { 
    "$match": { 
    "matched": true 
    } 
}).pretty() 

Alternative Version:

ähnlich wie oben Version aber dies verbindet das Projekt und Spiel Bühne in eine. Die $cond mit $redact Konten für Spiel und wenn Übereinstimmung gefunden wird es den kompletten Baum hält oder sonst verwirft es.

aggregate({ 
    "$project": { 
     "count": { 
      "$size": "$members" 
     }, 
     "members": 1 
    } 
}, { 
    "$unwind": "$members" 
}, { 
    "$group": { 
     "_id": "$members.group", 
     "data": { 
      "$push": { 
       "name": "$members.name", 
       "_id": "$members._id" 
      } 
     }, 
     "count": { 
      "$first": "$count" 
     } 
    } 
}, { 
    "$redact": { 
     "$cond": [{ 
       "$anyElementTrue": { 
        "$map": { 
         "input": "$data", 
         "as": "result", 
         "in": { 
          "$eq": ['$$result._id', 'id1'] 
         } 
        } 
       } 
      }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    } 
}).pretty() 
+0

Tanks viel sind! Ich kann deine erste Version verstehen, die zweite muss noch studieren weiter, weil ich nicht ganz die Verwendung von $ redact – aweiu

+0

jetzt verstehen, habe ich das verstanden version2 und ich habe zwei kleine Ratschläge für Ihre Antwort. 1. die Daten in der Gruppe können {$ Push: "$ Mitglieder"} 2.das $ eq in Version 2 ist nicht notwendig, weil der $ anyElementTrue nur Booleschen Wert zurück. Entschuldigung, mein Englisch ist nicht gut, das ist alles. – aweiu

+0

Vielen Dank für Ihr Feedback. Überprüft und aktualisiert die Änderungen entsprechend. – Veeram