grubu

7

Belgeler üzerinde grup işlemini yapan mongo sorgum var.grubu

Boş veya boş değerler olmadan sonuçları hassaslaştırmak istemediğimden neredeyse beklenen sonuçları aldım.

Şu benim sorgu şuna benzer:

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

Ve sonuç şöyle görünür:

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

ben alan değerleri ile grubun herhangi boş veya eğer satırları kaldırmak istiyorum DB'nin gerçek verilerinde null.

Excepted sonuçlar şöyle görünmelidir:

db.productMetadata.aggregate([ 
    { 
     "$match": { 
      "productAttribute.colour": { "$exists": true, "$ne": null } 
     } 
    }, 
    { 
     $group:{ 
      "_id": { 
       "color": "$productAttribute.colour", 
       "gender": "$productAttribute.gender" 
      }, 
      "count": { 
       $sum : 1 
      } 
     } 
    }   
]); 
:
{ "_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 } 

cevap

10

Sen varolan değil, boş gömülü alanda "$productAttribute.colour" dayalı gelen belgeleri filtreler fazladan $match boru hattı adımı ihtiyaç
0

$ $ işleminden önce $ match: {'color': {$ exists: true}} kullanmalısınız. Seyrek endeks ile oldukça hızlı çalışacaktır. Ve koleksiyonlardaki "boş" alanları saklamayın, bu da db boyutunu azaltacak ve sparse dizinleri için arama hızını artıracaktır (daha az belge indeks -> daha fazla hız)