2013-09-16 3 views
2

Я пытаюсь сделать функцию 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) 
}); 

Любые идеи, что может вызвать это или как я могу его решить?

спасибо, что вы все!

ответ

1

Похоже, что у вас есть документы с полями «userto» и «userfrom», и вы хотите суммировать количество документов, где «пользователь из» существует для определенного «userto», группируя «userfrom». Затем вы берете логарифм базы 10 каждой такой суммы и добавляете 1. Так как сокращение можно назвать итеративно, как написано, это может привести к регистрации логарифма частичной суммы, а затем взять лог этого результата. Возможно, это то, что вас беспокоит. Поэтому вы должны иметь 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 aggregation framework, новый в версии 2.2. Структура агрегации была разработана с учетом производительности и удобства использования, поэтому часто предпочитают mapReduce, если вы не делаете что-то специализированное. Следующее решение этой проблемы решается с использованием структуры агрегации вместо mapReduce:

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

Это действительно полезно. Я беру log out от уменьшения, и теперь, кажется, работает. Я осведомлен о структурах агрегации, к сожалению, мой код более сложный, это был просто тест. Спасибо огромное! – ke2g

+0

Без проблем, рад, что смогу помочь –

Смежные вопросы