MongoDB и MongoRuby: сортировка по карте - PullRequest
2 голосов
/ 12 октября 2011

В настоящее время я пытаюсь сделать простой 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 путем запроса базы данных.

1 Ответ

2 голосов
/ 23 февраля 2012

Используйте BSON::OrderedHash, и оно будет работать.

output = col.map_reduce(map, reduce,
    {
         :sort => BSON::OrderedHash.new[{"value", Mongo::ASCENDING}],
         :out => {:inline => true},
         :raw => true
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...