7

Ho una query mongo che esegue l'operazione di gruppo sui documenti.gruppo in mongo esclusi i valori nulli

Ho quasi ottenuto i risultati previsti, tranne che voglio perfezionare i risultati senza valori vuoti o nulli.

Attualmente la mia domanda si presenta così:

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

E i risultati sembra qualcosa di simile:

{ "_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 } 

Voglio rimuovere le righe se qualcuno del gruppo dai valori dei campi sono vuoti o null nei dati effettivi del DB.

risultati Excepted dovrebbe essere simile a questa:

{ "_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 } 

risposta

10

È necessario un $match passo gasdotto in più che filtrare i documenti in arrivo in base al settore embedded "$productAttribute.colour" esistente e non nullo:

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

Forse dovresti usare $ match: {'color': {$ exists: true}} prima dell'operazione $ group. Con indice sparse funzionerà abbastanza velocemente. E non memorizzare affatto campi "null" nelle raccolte, che ridurranno la dimensione del database e aumenteranno la velocità di ricerca per gli indici sparse (meno documenti in indice -> maggiore velocità)