我目前正在尝试对存储在 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
的上层调用来启用排序? The manual says ,我必须使用 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
}
)
关于ruby - MongoDB 和 MongoRuby : Sorting on mapreduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7741734/