MongoDB和mongorruby:基于mapreduce的排序



我目前正在尝试对存储在MongoDB中的一些文档做一个简单的mapreduce。我使用

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通过查询数据库。

使用BSON::OrderedHash就可以了。

output = col.map_reduce(map, reduce,
    {
         :sort => BSON::OrderedHash.new[{"value", Mongo::ASCENDING}],
         :out => {:inline => true},
         :raw => true
    }
)

相关内容

  • 没有找到相关文章

最新更新