【问题标题】:MongoDB. Map-Reduce finalize functionMongoDB。 Map-Reduce 终结函数
【发布时间】:2012-05-12 11:59:29
【问题描述】:

我想通过按日期累积来计算用户。我有以下地图减少功能:

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() 调用

【问题讨论】:

  • 是的,因为我不接受答案。我的问题通常是“为什么”,而不是“如何”
  • 如果它回答了您的问题,您应该接受它。这有助于未来的读者并奖励回答者。

标签: mongodb mapreduce


【解决方案1】:

是的,您不能在 map-reduce 函数中运行查询。它们必须只依赖于它们的输入参数。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 请注意:即使有可能,也不要这样做。如果您升级到 2.4,它就会消失,并且在 mongodb 文档中它明确指出:“地图功能不应该出于任何原因访问数据库。”和“reduce 函数不应该访问数据库,即使执行读取操作。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多