映射减少每分钟MongoDB中的文档数

映射减少每分钟MongoDB中的文档数,mongodb,mapreduce,statistics,Mongodb,Mapreduce,Statistics,我有一个MongoDB集合,每个文档中都存储有一个在处创建的。它们存储为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+

我有一个MongoDB集合,每个文档中都存储有一个在处创建的
。它们存储为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图表中,生成如下内容:


如何使用map reduce函数实现这一点,或者是否有一个奇特的MongoDB聚合函数可以替代使用?

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};
}
map=function(){
var created_at_minute=新日期(this.created_at.getFullYear(),
在.getMonth()处创建了此,
在.getDate()处创建了此,
在.getHours()处创建了此,
在.getMinutes()上创建了这个;
发射(在每分钟创建,{count:1});
}
reduce=函数(键、值){
var合计=0;
对于(var i=0;i
您也可以尝试此功能


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

其中create_at_minute是您的create_at字段,四舍五入为分钟。

--使用一些粗略的测试数据进行测试,似乎达到了海报的目的+1create_at_minute从何而来,mongodb在我运行该查询时是否能找到它?.group()是实现聚合的一种更简单的方法,但它有局限性。返回的BSON对象必须很小,密钥少于10K,否则会出现异常。Tom,我有点小谎。.group()中的“键”必须在集合中。所以rubayeet的解决方案更正确、更一般。啊,如果限制是10k,那么我运气不好,我的数据集已经是38k了。谢谢,对于其他数据集,该组看起来很有趣。