这是一个我发现使用mongoid(3.0.0)的有趣模式,我怀疑它是一个bug。
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(因为我有:limit =&gt; 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有关。有什么想法吗?
答案 0 :(得分:1)
首先请记住,Mongoid具有延迟加载功能:查询将在最后一刻被触发。
让我们挖掘你的问题:
last
:它将limit
设置为-1
,因此它将覆盖您之前的设置。要获得预期的行为,您必须强制Mongoid使用to_a
进行查询:products = Product.order_by([:_id, :asc ]).limit(5).to_a.last
count
:如果您想尊重limit
,请使用count(true)