MongoDB:在mapReduce中错误地计算

时间:2013-05-02 20:21:23

标签: mongodb

这是我的名为logins

的集合
db.logins.find().pretty()


      "cust_id" : "testuser",
       "created_at" : "2011-03-11 10:31:02.765"

      "cust_id" : "testuser",
      "created_at" : "2011-03-11 10:31:02.765"

我正在尝试根据日期

找出每个用户的登录信息

我试过这种方式

var m = function() {
    var aux = this.created_at.indexOf(' ');
    emit({cust:this.cust_id,daterr:this.created_at.substring(0,aux)},1);
}

var r = function(k, values) {
  var l = values.length;
  var r = 0;
  var i;
  for (i=0; i<l; i++) {
    r+=l;
  }
  return r;
}

 q = function() {
        var query = {"created_at": {$lt: "2013-04-30 11:19:52.587"}}
        return query;
    }

db.logins.mapReduce(m, r, { query : q(), out :  "userLoginCountMonthly" });

我收到以下输出

db.userLoginCountMonthly.find().pretty()

{ "_id" : { "cust" : "testuser", "daterr" : "2011-03-11" }, "value" : 4 }

我看到的是,该值必须为2,但显示为4

你能否告诉我为什么显示错误?

1 个答案:

答案 0 :(得分:1)

由于我从来没有使用过MongoDB的mapreduce而且我不太确定你在reduce中想要实现的是什么,但我看起来很不错,因此我可能完全不在这里;

var l = values.length;
var r = 0;
var i;
for (i=0; i<l; i++) {
  r+=l;
}
return r;

如果values.length为2,则循环两次,每次加2,返回4。

据我所知,因为你只想要一个计数,一个简单的return values.length作为一个简化函数会更有意义。