2016-12-27 3 views
0

In meinem aktuellen Projekt habe ich eine Struktur wie folgt aus:MongoDB - Anzeige aller Dokumente, durch die Zählung eines Array-Feldes

"squad": { 
    "members": [ 
     { 
      "name": "xyz", 
      "empty": true 
     }, 
     { 
      "name": "xyz", 
      "empty": true 
     }, 
     { 
      "name": "xyz", 
      "empty": true 
     } 
    ] 
} 

Jetzt möchte ich jeden Kader mit mongodb abzufragen, die zumindest haben, können 3 sagen leere Mitglied Slots. Ich habe gegoogelt und nur Aggregat und $ Größe gefunden, die anscheinend nur eine Array-Anzahl auswählen, nicht etwas pro Feld.
Irgendeine Idee, wie man es macht?

Antwort

0

Sie können diese Abfrage versuchen:

db.getCollection('collectionName').aggregate([ 
    {$unwind:"$squad.members"}, 
    {$group:{_id:"$_id",count:{$sum:{$cond: [{$eq: ['$squad.members.empty', true]}, 1, 0]}}}}, 
    {$match: {count: {$gte: 3}}} 
]) 

In dieser Abfrage angewendet bedingte Summe und dann prüfen, die Zählung größer oder gleich 3

0

Es werden alle Dokumente zurück leeren Slots mehr als 3

db.squad.aggregate([ 
    {$unwind:"$squad.members"}, 
    {$match:{"squad.members.empty": true}}, 
    {$group:{_id:"$_id",count:{$sum:1}}}, 
    {$match: {count: {$gt: 3}}} 
]) 
0

Sie können von $ Filter machen Einträge leeren Slots passen. Berechnen Sie als Nächstes $ size und vergleichen Sie sie mit dem Eingabewert und projizieren Sie, um Slots und $ match stage zu leeren, um Dokumente mit leeren Slots auszugeben, die gleich true sind.

aggregate({ 
    $project: { 
     "emptyslots": { 
      $eq: [{ 
       $size: { 
        $filter: { 
         input: "$squad.members", 
         as: "slot", 
         cond: { 
          $eq: ["$$slot.empty", true] 
         } 
        } 
       } 
      }, 3] 
     }, 
     data: "$$ROOT" 
    } 

}, { 
    $match: { 
     "emptyslots": true 
    } 
}); 

Diese Version vereint beide Projekt und Spiel Stufen in eine $ mit $ Cond Operator redact Stufe zu entscheiden, ob die Elemente zu halten oder zu beschneiden.

aggregate([{ 
    "$redact": { 
     "$cond": [{ 
       $eq: [{ 
        $size: { 
         $filter: { 
          input: "$squad.members", 
          as: "slot", 
          cond: { 
           $eq: ["$$slot.empty", true] 
          } 
         } 
        } 
       }, 3] 
      }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    } 
}]) 
Verwandte Themen