0

这是我的名为 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

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

4

1 回答 1

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作为 reduce 函数会更有意义。

于 2013-05-02T20:26:29.790 回答