这是我的名为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
你能否告诉我为什么显示错误?
答案 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
作为一个简化函数会更有意义。