我遇到了mongoid的错误,当我调用方法last
class Post
include Mongoid::Document
end
Post.create
Post.create
Post.first == Post.last #=> true
版本信息:
答案 0 :(得分:2)
这不是Mongoid中的错误,这是您对first
和last
方法的期望中的错误。来自fine version 5 manual:
#first⇒文件
注意:当用户未明确提供排序参数时,Mongoid之前添加了
_id
排序。这会导致性能问题,并且不会出现这种情况,因此如果未提供排序参数,#first
/#last
将不再保证顺序。对于订单保证 - 必须明确提供排序。在数据库中获取标准选择器的第一个文档。
因此,first
(从Mongoid5开始)为查询提供了与当前订单相关的第一个文档,但它不再提供默认订单。如果您希望first
的行为与以往相同,则您需要在查询中提供自己的sort
订单。
同样适用于last
。
答案 1 :(得分:0)
似乎旧的行为又回到了Mongoid 6? - 我使用6.1.0,我遇到以下情况:
t(prod)> Benchmark.measure { Event.where(:created_at => 7.days.ago..1.day.ago).first }
=> #<Benchmark::Tms:0x00000003cb00b8 @cstime=0.0, @cutime=0.0, @label="", @real=4.109985898248851, @stime=0.0, @total=0.0, @utime=0.0>
t(prod)> Benchmark.measure { Event.where(:created_at => 7.days.ago..1.day.ago).limit(1).entries.first }
=> #<Benchmark::Tms:0x000000037377f8 @cstime=0.0, @cutime=0.0, @label="", @real=2.6328365616500378, @stime=0.0, @total=0.0, @utime=0.0>
所以使用.first而不是.limit(1).entries.first大约是两倍慢。一种解决方法是:.first(id_sort :: none)
希望有所帮助:)