MongoDB计算数组中的项目

时间:2016-06-12 17:36:16

标签: mongodb aggregation-framework

假设我们有一个如下集合

{ "_id" : 1, "item" : "ABC", "sizes": [ "S", "M", "L"] },
{ "_id" : 2, "item" : "EFG", "sizes": [ "S" ] },
{ "_id" : 3, "item" : "ABC", "sizes": [ "M" ] }

我们如何列出数组中的项目(大小)以及与大小相关联的项目数量

例如

size 'S', item 'ABC' = 1
size 'S', item 'EFG' = 1
size 'M', item 'ABC' = 2
size 'L', item 'ABC' = 1

请注意,尺寸“M”必须是项目为“ABC”的实例。

我尝试了以下

db.collection.group(
{
    key: {'sizes': true}, 
    initial: {sum: 0}, 
    reduce: function(doc, prev) { prev.sum += 1}
});

但它没有解开数组,我似乎无法将该项添加为组计数的一部分

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

您需要$unwind"尺寸"数组然后$group by" item"和"尺寸"并使用$sum返回计数。

db.collection.aggregate(
    [ 
        { "$unwind": "$sizes" }, 
        { "$group": { 
            "_id": { 
                "item": "$item", 
                "sizes": "$sizes" 
            }, 
            "count": { "$sum": 1 } 
        }}
    ]
) 

产生:

{ "_id" : { "item" : "EFG", "sizes" : "S" }, "count" : 1 }
{ "_id" : { "item" : "ABC", "sizes" : "L" }, "count" : 1 }
{ "_id" : { "item" : "ABC", "sizes" : "M" }, "count" : 2 }
{ "_id" : { "item" : "ABC", "sizes" : "S" }, "count" : 1 }