2011-10-12 44 views
2

我目前正試圖對存儲在MongoDB中的一些文檔做一個簡單的mapreduce。我用MongoDB和MongoRuby:在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; 
}" 

的減少。

output = col.map_reduce(map, reduce, # col is the collection in mongodb, e.g. db.users 
      { 
       :out => {:inline => true}, 
       :raw => true 
      } 
     ) 

現在到了真正的問題:我如何可以使用map_reduce上呼叫,能在排序時我打電話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

+0

怎麼樣:排序=> {「價值」,蒙戈:: ASCENDING} .. – RameshVel

+0

這改變了錯誤信息'不能創建在[收藏]光標查詢:{}排序:{值:1}'。 – evnu

回答

2

使用BSON::OrderedHash它會工作。

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