1

我有具有以下结构的文件:

{
    "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 函数,但我不确定哪个最适合用于像这样的简单计数。

欢迎提出建议!谢谢。

4

2 回答 2

1

当您使用聚合时,它变得非常容易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} }}
于 2014-01-17T21:01:20.820 回答
-1

您可以将 doc.items 的长度存储为 doc 的元素。这种方法会导致磁盘冗余,但却是处理大型集合的一种快速简便的方法。

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

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

于 2012-12-28T07:52:29.453 回答