我想计算按日期累积的用户。我有以下map reduce函数:
var m = function(){
// creation date
var d = new Date(parseInt(this._id.toString().slice(0,8), 16)*1000);
// ticks
var t = d.getTime();
emit(d2,d3);
};
var r = function(k,v){
return v[0]; // just go next with ticks
};
var opts = { out : { merge : "UserAccum", db : "Metric"},
finalize: function(k,v){
var str = "parseInt(this._id.toString().slice(0,8), 16)*1000 <= "+v;
return db.User.count({$where:str});
}
};
var res = db.Provider.mapReduce(m, r, opts);
运行时,我收到错误:
Sat May 12 17:47:23 uncaught exception: map reduce failed:{
"assertion" : "invoke failed: JS Error: TypeError: db has no properties
nofile_b:2",
"assertionCode" : 9004,
"errmsg" : "db assertion failure",
"ok" : 0
}
看起来无法调用db。 finalize中的方法。 为什么呢?
我知道我可以从map()和reduce()
调用答案 0 :(得分:4)
是的,您无法在map-reduce函数中运行查询。它们必须仅依赖于它们的输入参数。
答案 1 :(得分:0)
您可以在mapreduce函数中运行查询,只是db是对默认数据库的引用,而不是自动运行的数据库。
所以你需要这样做: var fdb = db.getSiblingDB('yourdb'); var results = fdb.yourcollection.find(..);
我不知道这是否是新的,并且在一年前的版本中没有用。在这种情况下,“can”也可能与“should”不同。