2015-12-11 43 views
0
{ 
"sku" : "sku", 
"price" : 0, 
"name" : "name", 
"attributes" : [ 
    { 
     "name" : "fit", 
     "value" : "Regular", 
     "slug" : "regular", 
     "fit" : "regular" 
    }, 
    { 
     "name" : "color_family", 
     "value" : "Red", 
     "slug" : "red", 
     "color_family" : "red" 
    }, 
    { 
     "name" : "occassion", 
     "value" : "Casual", 
     "slug" : "casual", 
     "occassion" : "casual" 
    } 
] 

},

以上就是我蒙戈館藏結構,同時將$放鬆我的屬性鍵和屬性蛞蝓,申請組之後,然後通過收集得到兩次組.. 我的查詢是

db.products_mumbai.aggregate(
    {$unwind : "$attributes"}, 
    {$group : { _id : "$attributes.color_family", quantity : { $sum:1 } } }) 

的響應是

{ "_id" : "red", "quantity" : 21 } 
{ "_id" : null, "quantity" : 126 } 
+0

錯誤在哪裏? –

+0

我不希望null組中的空值由....然後我必須做..? –

回答

0

這是完全正常的行爲。

當你展開一個數組時,考慮MongoDB作爲你的數組添加新文檔。在每個例子你的情況下,$開卷將導致有3個文件:

{ 
"sku" : "sku", 
"price" : 0, 
"name" : "name", 
"attributes" : 
    { 
     "name" : "fit", 
     "value" : "Regular", 
     "slug" : "regular", 
     "fit" : "regular" 
    } 
}, 
{ 
"sku" : "sku", 
"price" : 0, 
"name" : "name", 
"attributes" : 
    { 
     "name" : "color_family", 
     "value" : "Red", 
     "slug" : "red", 
     "color_family" : "red" 
    } 
}, 
{ 
"sku" : "sku", 
"price" : 0, 
"name" : "name", 
"attributes" : 
    { 
     "name" : "occassion", 
     "value" : "Casual", 
     "slug" : "casual", 
     "occassion" : "casual" 
    } 
} 

然後,你問他組由attributes.color_family。由於只有一個文件有這個鍵,所以你的紅色是一個,而其他的都是空的。

編輯: 如果你想避免前null值,那麼你的$unwind$group必須添加一個$match

{ $match : { "attributes.color_family": {$exists:true} } } 
+0

但我不希望組中的空值由...然後我必須做什麼? –

+0

@AsheshKhatri我編輯了我的答案來刪除空值。 –

+0

好thnks,其工作.... –

0

如果你不需要輸出空你可以做的是添加一個額外的匹配到你的聚合:

db.products_mumbai.aggregate(
    {$unwind : "$attributes"}, 
    {$group : { _id : "$attributes.color_family", quantity : { $sum:1 } } }), 
    {$match : { _id : {$ne: null }}} 
) 
+1

正如我的答案中所設置的那樣,我將$ match放在$組之前。我認爲在大盤上它會有更好的表現。 –

+0

@ConstantinGuay是的,這是真的。 –