2016-08-01 3 views
2

Hier ist mein db.zählen Dokumente nach bestimmten verschachtelten Feldern Werte mit Aggregation-Framework in MongoDB

{ 
"_id" : ObjectId("579cab6c6aba30f42a57a979"), 
"iecode" : "P1111", 
"country" : "India", 
"totalTreatmentArms" : 3, 
"treatmentArms" : [ 
    { 
     "mechanismOrPkg" : "Mechanism", 
     "mechanism" : "mechanism1" 
    }, 
    { 
     "mechanismOrPkg" : "Mechanism", 
     "mechanism" : "mechanism2" 
    }, 
    { 
     "mechanismOrPkg" : "Package", 
     "mechanism" : "mechanism1" 
    } 
] 
} 


{ 
"_id" : ObjectId("579cab7a6aba30f42a57a97a"), 
"iecode" : "P1111", 
"country" : "Canada", 
"totalTreatmentArms" : 3, 
"treatmentArms" : [ 
    { 
     "mechanismOrPkg" : "Mechanism", 
     "mechanism" : "mechanism1" 
    }, 
    { 
     "mechanismOrPkg" : "Mechanism", 
     "mechanism" : "mechanism2" 
    }, 
    { 
     "mechanismOrPkg" : "Package", 
     "mechanism" : "" 
    } 
] 
} 


{ 
"_id" : ObjectId("579cabac6aba30f42a57a97b"), 
"iecode" : "P2222", 
"country" : "India", 
"totalTreatmentArms" : 1, 
"treatmentArms" : [ 
    { 
     "mechanismOrPkg" : "Package", 
     "mechanism" : "" 
    } 
] 
} 


{ 
"_id" : ObjectId("579cabe76aba30f42a57a97c"), 
"iecode" : "P3333", 
"country" : "India", 
"totalTreatmentArms" : 2, 
"treatmentArms" : [ 
    { 
     "mechanismOrPkg" : "Mechanism", 
     "mechanism" : "mechanism1" 
    }, 
    { 
     "mechanismOrPkg" : "Package", 
     "mechanism" : "" 
    } 
] 
} 

Bitte beachten Sie, dass es zwei Datensätze mit iecode : P1111 und ich möchte nur ein Datensatz auf iecode so unterscheiden führen (ein) in Betracht gezogen werden.

Jetzt ist meine Anforderung, ich möchte auf Feld mechanismOrPkg zählen. Wenn es den Wert Package enthält, werden wir package um eins erhöhen. Wenn der Wert Mechanism ist, dann betrachten wir den Wert des Feldes mechanism, und die Anzahl der respektierten Werte wird berücksichtigt.

So Endergebnis wird so sein

{ 
"_id" : null, 
"totalPackage" : 3, 
"totalMechanism1" : 2, 
"totalMechanism2" : 1 
} 

Bitte fragen, ob es verwirrend klingt. Lassen Sie mich wissen, auch wenn diese Art der Aggregation mit Abfrage möglich ist oder ich Server-Filterung durchführen muss?

Danke.

bearbeiten

Mögliche Werte von mechanismOrPkg: Paket oder Mechanism

Mögliche Werte des Mechanismus: mechanism1 oder mechanism2

+2

Sie auch, wenn alle Dokumente 'mechani angeben sollten sm' Wert, wo 'mechanismOrPkg'' Mechanism' ist, kann nur 2 Werte haben ('mechanism1',' mechanism2') wie in Ihrem Beispiel oder die Anzahl der möglichen Mechanismen ist nicht durch Ihre Anwendung eingeschränkt und es könnte 'mechanism3',' mechanism4 sein ', ... so wird das Ergebnisdokument je nach Sammlungsstatus unterschiedlich lang sein. – tarashypka

+0

@tarashypka Danke für's Bemerken. Überprüfen Sie meine Bearbeitung. –

Antwort

3

die oben Vervollständigung erfordern würde, die $cond Operator im $sum Akkumulator mit Operator. Der $cond Operator wird eine logische Bedingung basierend auf seinem ersten Argument (if) auswerten und gibt dann das zweite Argument zurück, bei dem die Auswertung wahr ist (then) oder das dritte Argument mit false (else). Dies wandelt die true/false Logik in 1 und 0 numerische Werte um, die in $sum eingegeben werden. So zum Beispiel, wenn Sie den Zähler für den „Package“ Wert aggregieren wollen, folgt der Logik:

{ 
    "$sum": { 
     "$cond": [ { "$eq": [ "$treatmentArms.mechanismOrPkg", "Package" ] }, 1, 0 ] 
    } 
} 

Als resultierende Pipeline, müssen Sie

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": "$iecode", 
      "treatmentArms": { "$first": "$treatmentArms" } 
     } 
    }, 
    { "$unwind": "$treatmentArms" }, 
    { 
     "$group": { 
      "_id": null, 
      "totalPackage": { 
       "$sum": { 
        "$cond": [ 
         { "$eq": [ "$treatmentArms.mechanismOrPkg", "Package" ] }, 
         1, 0 
        ] 
       } 
      }, 
      "totalMechanism1":{ 
       "$sum": { 
        "$cond": [ 
         { 
          "$and": [ 
           { "$eq": [ "$treatmentArms.mechanismOrPkg", "Mechanism" ] }, 
           { "$eq": [ "$treatmentArms.mechanism", "mechanism1" ] } 
          ] 
         }, 
         1, 
         0 ] 
       } 
      }, 
      "totalMechanism2": { 
       "$sum": { 
        "$cond": [ 
         { 
          "$and": [ 
           { "$eq": [ "$treatmentArms.mechanismOrPkg", "Mechanism" ] }, 
           { "$eq": [ "$treatmentArms.mechanism", "mechanism2" ] } 
          ] 
         }, 
         1, 
         0 ] 
       } 
      } 
     } 
    } 
]) 
die Aggregation Betrieb laufen

Beispielausgabe

{ 
    "_id" : null, 
    "totalPackage" : 3, 
    "totalMechanism1" : 2, 
    "totalMechanism2" : 1 
} 
+0

Ich bekomme '0 Datensätze abgerufen '. Ich denke, die erste Gruppierung sollte auf 'iecode' erfolgen. –

+1

Führen Sie den Aggregationsvorgang für die richtige Sammlung aus? Wie Sie sehen können, gruppiert sich die erste Gruppierung tatsächlich nach dem Feld "iecode". – chridam

+0

Entschuldigung (Gruppierung). Ja, ich frage die richtige Sammlung immer noch das gleiche Ergebnis. –

Verwandte Themen