7

Ich habe Mongo-Abfrage, die die Gruppenoperation auf die Dokumente ausführt.Gruppe in Mongo ohne Nullwerte

Ich habe fast die erwarteten Ergebnisse, außer dass ich die Ergebnisse ohne leere oder Null-Werte verfeinern möchte.

Derzeit meine Abfrage sieht wie folgt aus:

db.productMetadata.aggregate([{$group:{"_id":{"color":"$productAttribute.colour","gender":"$productAttribute.gender"},"count" : {$sum : 1}}}]); 

Und die Ergebnisse sieht ungefähr so ​​aus:

{ "_id" : { "color" : "BLUE", "gender" : "MEN" }, "count" : 1 } 
{ "_id" : { }, "count" : 4 } 
{ "_id" : { "color" : "NA", "gender" : "WOMEN" }, "count" : 1 } 
{ "_id" : { "color" : "BLACK", "gender" : "MEN" }, "count" : 1 } 
{ "_id" : { "color" : "BROWN", "gender" : "WOMEN" }, "count" : 1 } 
{ "_id" : { "gender" : "MEN" }, "count" : 2 } 
{ "_id" : { "color" : "BEIGE", "gender" : "MEN" }, "count" : 1 } 
{ "_id" : { "color" : "BROWN", "gender" : "MEN" }, "count" : 1 } 

Ich möchte die Zeilen zu entfernen, wenn eine der Gruppe von Feldwerten leer sind oder Null in den tatsächlichen Daten der DB.

Gestellte Ergebnisse sollen wie folgt aussehen:

{ "_id" : { "color" : "BLUE", "gender" : "MEN" }, "count" : 1 } 
{ "_id" : { "color" : "NA", "gender" : "WOMEN" }, "count" : 1 } 
{ "_id" : { "color" : "BLACK", "gender" : "MEN" }, "count" : 1 } 
{ "_id" : { "color" : "BROWN", "gender" : "WOMEN" }, "count" : 1 } 
{ "_id" : { "color" : "BEIGE", "gender" : "MEN" }, "count" : 1 } 
{ "_id" : { "color" : "BROWN", "gender" : "MEN" }, "count" : 1 } 

Antwort

10

Sie benötigen einen zusätzlichen $match Pipeline Schritt, der die eingehenden Dokumente basierend auf dem Embedded-Bereich "$productAttribute.colour" bestehende und nicht null filtert:

db.productMetadata.aggregate([ 
    { 
     "$match": { 
      "productAttribute.colour": { "$exists": true, "$ne": null } 
     } 
    }, 
    { 
     $group:{ 
      "_id": { 
       "color": "$productAttribute.colour", 
       "gender": "$productAttribute.gender" 
      }, 
      "count": { 
       $sum : 1 
      } 
     } 
    }   
]); 
0

Vielleicht sollten Sie $ match: {'color': {$ exists: true}} vor $ group operation verwenden. Mit Sparse Index wird es ziemlich schnell funktionieren. Und speichern Sie nicht "Null" Felder in Sammlungen überhaupt, das wird die Datenbankgröße reduzieren und erhöht die Suchgeschwindigkeit für sparse Indizes (weniger Dokumente im Index -> mehr Geschwindigkeit)