2012-09-11 44 views
0

這是一個我使用mongoid(3.0.0)發現的有趣模式,我猜測它是一個錯誤。Mongoid :: Criteria#last修改標準並給出錯誤結果

1.9.3p194 :007 > products = Product.order_by([:_id, :asc ]).limit(5) 
=> #<Mongoid::Criteria 
  selector: {}, 
  options: {:sort=>{"_id"=>1}, :limit=>5}, 
  class: Product, 
  embedded: false> 

1.9.3p194 :008 > products.map(&:_id) 
=> ["500fa5614f6d3a23d0000002", "500fa5614f6d3a23d0000003", "500fa5614f6d3a23d0000004", "500fa5614f6d3a23d0000005", "500fa5614f6d3a23d0000006"] 

到目前爲止好!但是,如果我發佈以下內容 - 我會得到奇怪的結果。

1.9.3p194 :012 > products.count 
=> 3654017 

這說明我所有產品計數,而不是5(因爲我有:極限=> 5)

1.9.3p194 :012 > Product.count 
=> 3654017 

現在更加怪異的一部分:

1.9.3p194 :010 > products.last 
=> #<Product _id: 504952620a5e2323460000aa, _type: nil, ... > 

這應該是_id:500fa5614f6d3a23d0000006。現在,如果我嘗試再次映射ID,我會得到:

1.9.3p194 :019 > products.map(&:id) 
=> ["504952620a5e2323460000aa", "504952620a5e2323460000a9", "504952620a5e2323460000a8", "5049524f0a5e2323460000a7", "504950ab0a5e2323460000a6"] 

這完全改變了標準!但是,我得到適當的結果:

1.9.3p194 :008 > products = Product.order_by([:_id, :asc ]).limit(5) 
=> #<Mongoid::Criteria 
  selector: {}, 
 options: {:sort=>{"_id"=>1}, :limit=>5}, 
 class: Product, 
 embedded: false> 

1.9.3p194 :028 > products[0].id 
=> "500fa5614f6d3a23d0000002" 
1.9.3p194 :029 > products[-1].id 
=> "500fa5614f6d3a23d0000006" 

雖然這似乎與Mongoid 3.0.0有關。有任何想法嗎?

回答

1

首先要記住的是,Mongoid具有延遲加載功能:查詢將在最後時刻觸發。

讓我們深入的問題:

  • last:它設置limit-1所以它將覆蓋以前的設置。爲了讓您的預期行爲,就必須迫使Mongoid使用to_a進行查詢:products = Product.order_by([:_id, :asc ]).limit(5).to_a.last

  • count:如果你要尊重limit,使用count(true)

+0

真棒!謝謝。計數(真)不起作用。 'p.count(true)'從'(mongoid-3.0.3)/lib/mongoid/contextual/mongo.rb:70:in count'拋出'NoMethodError:未定義方法'id'爲真:TrueClass \t –