Map-Reduce计算每分钟MongoDB中文档的数量

5

我有一个MongoDB集合,其中每个文档都存储了一个created_at。这些被存储为MongoDB日期对象,例如:

{ "_id" : "4cacda7eed607e095201df00", "created_at" : "Wed Oct 06 2010 21:22:23 GMT+0100 (BST)", text: "something" }
{ "_id" : "4cacdf31ed607e0952031b70", "created_at" : "Wed Oct 06 2010 21:23:42 GMT+0100     (BST)", text: "something" }
....

我想要计算每分钟创建的项目数量,以便将数据传递给Google Charts生成类似于上图的内容。我应该如何使用map reduce函数来实现这个功能,还是有MongoDB聚合函数可以使用?
2个回答

8

Map函数应该发出一个时间戳对象,调整到分钟,并计数为1。Reduce函数应该对所有计数进行求和:

map = function() {
    var created_at_minute = new Date(this.created_at.getFullYear(),
                                     this.created_at.getMonth(), 
                                     this.created_at.getDate(), 
                                     this.created_at.getHours(), 
                                     this.created_at.getMinutes());
    emit(created_at_minute, {count: 1});
}

reduce = function(key, values) { 
    var total = 0;
    for(var i = 0; i < values.length; i++) { 
        total += values[i].count; 
    }
    return {count: total};
}

经过一些简单的测试数据,该程序似乎实现了作者的意图... +1 - gnarf

0

你也可以尝试使用group函数。


db.stat.group({key:{"create_at_minute":true}
              ,initial:{count:0}
              ,reduce:function(doc,out){out.count++}})

其中 create_at_minute 是按分钟四舍五入后的 create_at 字段。


create_at_minute是从哪里来的?当我运行该查询时,MongoDB会自动处理吗? - Tom
".group()是一种更简单的实现聚合的方式,但它有限制。返回的BSON对象必须很小,少于10K个键,否则会产生异常。" - rubayeet
Tom,我有点说谎了。在.group()中的“key”必须在集合中。因此,Rubayeet的解决方案更正确和通用。 - walla
啊,如果限制是10k,那我就没戏了,我的数据集已经达到了38k。谢谢,这个群对其他数据集看起来很有趣。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接