Mongodb:使用mapreduce / aggregation对数组值进行计数



我有以下结构的文档:

{
    "name" : "John",
    "items" : [
       {"key1" : "value1"},
       {"key1" : "value1"}
    ]
}

并建立了一个简单的函数来计算"项目"的总数。

var count = 0;
db.collection.find({},{items:1}).limit(10000).forEach(
    function (doc) {
        if(doc.items){
               count += doc.items.length;
        }
    }
)
print(count);

但是超过100万项后,我的函数中断,Mongo退出。我已经研究了新的聚合框架和mapreduce函数,但我不确定哪一个最适合用于这样的简单计数。

建议欢迎!谢谢。

当您使用聚合时,它变得非常容易http://docs.mongodb.org/manual/core/aggregation-pipeline/

db.collection.aggregate(
     { $unwind : "$items" }, 
     { $group  : {_id:null, items_count : {$sum:1} }}
)

返回每个文档的项目计数,

{ $group  : {_id:"$_id", items_count : {$sum:1} }}

可以存储文档的长度。项作为文档的元素。这种方法会导致磁盘冗余,但它是处理大型集合的一种快速简便的方法。

{
    "name" : "John",
    "itemsLength" : 2,
    "items" : [
       {"key1" : "value1"},
       {"key1" : "value1"}
    ]
}

另一个选择可能是使用mapreduce,但是,我认为,没有分片mapreduce会很慢。

相关内容

  • 没有找到相关文章

最新更新