map调用失败:JS错误:错误:fast_emit需要2个args(anon):1

时间:2013-05-01 18:31:44

标签: mongodb

将从以下js文件创建一个集合,我需要在我的集合中使用三个字段,所以我已经给出了

 emit(this.cust_id, 1,date);

给出以下错误

地图调用失败:JS错误:错误:fast_emit需要2个args(anon):1

但它与emit(this.cust_id, 1);

一起工作正常

请告诉我在创建的集合中包含日期aslo?

m = function() { 
 var currentDate = new Date();
        currentDate.setDate(currentDate.getDate()-1);
        var month = (currentDate.getMonth() < 9 ? "0"+ (currentDate.getMonth()+1) : (currentDate.getMonth()+1));
        var day = (currentDate.getDate() < 10 ? "0" + currentDate.getDate() : currentDate.getDate());
        var date = currentDate.getTime();
emit(this.cust_id, 1,date);
 }

r = function (k, vals) { var sum = 0; for (var i in vals) { sum += vals[i]; } return sum; }

   q = function() {
        var currentDate = new Date();
        currentDate.setDate(currentDate.getDate()-1);
        var month = (currentDate.getMonth() < 9 ? "0"+ (currentDate.getMonth()+1) : (currentDate.getMonth()+1));
        var day = (currentDate.getDate() < 10 ? "0" + currentDate.getDate() : currentDate.getDate());
        var date = currentDate.getTime();
        var patt = date;
        var query = {"created_at":"2013-30-04 11:19:52.587"};
        return query;
}


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

1 个答案:

答案 0 :(得分:2)

如错误所示,您只能发出两个参数。一个代表您将分组/聚合值的关键,另一个代表该文档的值。

如果需要计算多个字段,则需要输出单个值,即文档。在您的示例中,如果1表示计数,而日期表示您可以输出的某个日期:

emit(this.cust_id, {count: 1, date: this.date);

如果您从文档中提取日期,则为此。我不确定你为什么要在地图运行时存储日期,但显然你可以在该字段中包含你自己的日期。

请注意,当您将值作为文档发出时,必须在reduce函数中返回完全相同的格式。你可以看到here的一个例子,它们为每个发射输出两个不同的值,然后在reduce中处理(你可以忽略finalize函数)。