MapReduce 函数错误与猫鼬



我正在尝试执行MapReduce函数,但是,我不知道为什么,它返回下一个错误:

{ [MongoError: exception: assertion src/mongo/db/commands/mr.cpp:424]
     name: 'MongoError',
     errmsg: 'exception: assertion src/mongo/db/commands/mr.cpp:424',
     code: 0,
     ok: 0 
}

我的代码:

O.query = {userto:id,userfrom:{$exists:true}};//"id" is a var  
O.map = function () {
                     emit(this.userfrom[0],1);
                 };
O.reduce = function (id,val) {return ((Math.log(Array.sum(val))/Math.LN10)+1)};
O.verbose = false;
T.mapReduce(O,function(err,model,stats){
    console.log(err)
    console.log(model)
    console.log(stats)
});

任何想法会导致这种情况或我如何解决它?

谢谢大家!

看起来您有带有"userto"和"userfrom"字段的文档,并且您希望对特定"userto"存在"userfrom"的文档数量求和,按"userfrom"分组。然后你取每个这样的总和的底数 10 对数并加 1。由于reduce可以迭代调用,正如所写的那样,这最终可能会获取部分和的对数,然后获取该结果的对数。这可能是给你带来麻烦的原因。因此,您应该让 mapReduce 只获取计数,然后获取日志并添加 1。以下内容对我有用,使用mapReduce和MongoDB 2.4.6:

var id = "sam";
var query = {userto:id,userfrom:{$exists:true}};
var map = function () {
    emit(this.userfrom, 1);
};
var reduce = function (id,emits) {
    return Array.sum(emits);
};
db.foo.mapReduce(map, reduce, {
    "query": query,
    "out": "foo_out"
});

输入和输出为:

# input
{ "_id" : ObjectId("523750e41e31334eb99aae73"), "userfrom" : "dave", "userto" : "sam" }
{ "_id" : ObjectId("523750fa1e31334eb99aae74"), "userfrom" : "kyle", "userto" : "sam" }
{ "_id" : ObjectId("523753571e31334eb99aae75"), "userfrom" : "kyle", "userto" : "sam" }
{ "_id" : ObjectId("523753581e31334eb99aae76"), "userfrom" : "kyle", "userto" : "sam" }
{ "_id" : ObjectId("5237535c1e31334eb99aae77"), "userfrom" : "dave", "userto" : "sam" }
# output
{ "_id" : "dave", "value" : 2 }
{ "_id" : "kyle", "value" : 3 }

另外,您运行的是哪个版本的MongoDB?升级可能会有所帮助。

也就是说,对于大多数像这样的聚合任务,最好使用MongoDB的聚合框架,这是2.2版中的新功能。聚合框架在设计时考虑了性能和可用性,因此除非您正在做一些专门的事情,否则它通常更喜欢mapReduce。下面使用聚合框架而不是mapReduce解决了相同的问题:

db.foo.aggregate([
  {$match: {userto: "sam"}},
  {$group: {_id: "$userfrom", count: {$sum: 1}}}
]);

相关内容

  • 没有找到相关文章

最新更新