首页 文章

MongoDB的 . Map-Reduce完成功能

提问于
浏览
3

我想计算按日期累积的用户 . 我有以下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()调用

2 回答

  • 4

    是的,您无法在map-reduce函数中运行查询 . 它们必须仅依赖于它们的输入参数 .

  • 0

    您可以在mapreduce函数中运行查询,只是db是对默认数据库的引用,而不是自动运行的数据库 .

    所以你需要这样做:var fdb = db.getSiblingDB('yourdb'); var results = fdb.yourcollection.find(..);

    我不知道这是否是新的,并且在一年前的版本中不起作用 . 在这种情况下,“可以”也可以与“应该”不同 .

相关问题