В настоящее время я пытаюсь сделать простой mapreduce для некоторых документов, хранящихся в MongoDB.Я использую
map = BSON::Code.new "function() { emit(this.userid, 1); }"
для отображения и
reduce = BSON::Code.new "function(key, values) {
var sum = 0;
values.forEach(function(value) {
sum += value;
});
return sum;
}"
для сокращения.Это прекрасно работает, когда я вызываю map_reduce
следующим образом:
output = col.map_reduce(map, reduce, # col is the collection in mongodb, e.g. db.users
{
:out => {:inline => true},
:raw => true
}
)
Теперь возникает реальный вопрос: как я могу использовать верхний вызов map_reduce
, чтобы включить сортировку? В руководстве написано , что я должен использовать sort
и массив из [key, direction]
пар.Я догадался, что следующее должно работать, но это не так:
output = col.map_reduce(map, reduce,
{
:sort => [["value", Mongo::ASCENDING]],
:out => {:inline => true},
:raw => true
}
)
Нужно ли выбирать другой тип данных?Эта опция также не работает (та же ошибка), когда используется пустой []
, хотя в руководстве сказано, что эта опция используется по умолчанию.К сожалению, сообщение об ошибке от MongoDB не слишком помогает:
/usr/lib/ruby/gems/1.9.1/gems/mongo-1.3.1/lib/mongo/db.rb:506:in `command': Database command 'mapreduce' failed: {"assertion"=>"sort has to be blank or an Object", "assertionCode"=>13609, "errmsg"=>"db assertion failure", "ok"=>0.0} (Mongo::OperationFailure)
from /usr/lib/ruby/gems/1.9.1/gems/mongo-1.3.1/lib/mongo/collection.rb:576:in `map_reduce'
from ./mapreduce.rb:26:in `<main>'
Если вам нужен полный исполняемый код, пожалуйста, сообщите об этом в комментариях.Пока я исключаю его, поскольку он содержит только инициализацию соединения с mongodb и инициализацию коллекции col
путем запроса базы данных.