Mongodb 带有mongoose的mapreduce函数错误
我正在尝试执行MapReduce函数,但不知道为什么,它会返回下一个错误:Mongodb 带有mongoose的mapreduce函数错误,mongodb,mapreduce,mongoose,Mongodb,Mapreduce,Mongoose,我正在尝试执行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 = {u
{ [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}}}
]);
那真的很有帮助。我从reduce中取出日志,现在似乎可以工作了。我知道聚合框架,不幸的是我的代码更复杂,这只是一个测试。非常感谢你!没问题,很高兴我能帮忙