Mongoid 3 - 访问map_reduce结果

时间:2012-08-02 19:47:56

标签: mongodb mongoid ruby-on-rails-3.2

在mongoid 2中,这曾经起作用:

mr_collection = self.collection.map_reduce(map, reduce, {
  :query => query,
  :finalize => finalize,
  :out => {:replace => 'mr_results'}
})

limit = (options[:limit] || 10)
skip = (options[:skip].to_i || nil)
page = if skip >= limit
  ((skip+limit) / limit)
else
  1
end

sort = if options[:sort_by_vintage]
  [['value.vy', :desc], ['value.s', (options[:sort] || :desc)], ['value.pml', :asc]]
elsif options[:sort_by_sDate]
  [['value.sDate', :desc], ['value.s', (options[:sort] || :desc)], ['value.pml', :asc]]
else
  [['value.s', (options[:sort] || :desc)], ['value.pml', :asc]]
end
paginator = WillPaginate::Collection.new(page, limit, collection_count)
collection = mr_collection.find({},{
    :sort => sort,
    :limit => limit,
    :skip => skip
  }
).to_a

我已将map_reduce调用更新为:

mr_collection = self.where(query).map_reduce(map, reduce).finalize(finalize).out({:replace => 'mr_results'})

不再产生任何错误,但是无论我尝试什么,collection = mr_collection.find ....总是会失败。以下是一些尝试:

(rdb:1) mr_collection.find.sort(sort)

产生     .rvm / rubies / ruby​​-1.9.3-p194 / lib / ruby​​ / 1.9.1 / debug.rb:130:在'eval'中:参数个数错误(1表示0)

我可以看到     (rdb:1)mr_collection.class     Mongoid ::语境:: MapReduce的

(rdb:1) mr_collection.find.class
Enumerator

尝试:     (rdb:1)mr_collection.sort(sort)     .rvm / rubies / ruby​​-1.9.3-p194 / lib / ruby​​ / 1.9.1 / debug.rb:130:在`eval'中:参数个数错误(1表示0) 所以同样的错误

感谢您的帮助

更新

使用以下方法修正了它:

collection = mr_collection.find(
    :sort => sort,
    :limit => limit,
    :skip => skip
 )

我的问题是现在使用collection.to_a,我知道它适用于常规哈希,但集合中的结果是Moped :: BSON :: Document类型。在集合上调用任何Enumerator方法会导致此错误:

undefined method `call' for #<Hash:
我生气了。请帮忙!!

我试过的事情包括:

collection = collection.each {|c| c.to_hash}.to_a

collection = collection.collect {|c| c.to_hash}.to_a

谢谢:)

1 个答案:

答案 0 :(得分:3)

最后,感谢Mongoid google小组。详情请见https://groups.google.com/d/topic/mongoid/T6XhqLtofTE/discussion

一个班轮修正案是:

collection = mr_collection.send(:documents).sort(sort).limit(limit).skip(skip).to_a

在即将推出的mongoid版本中,Mongoid :: Contextual :: MapReduce#文档将从私有方法更改为公共方法,并且不再需要.send(:documents)。