mongoid在调用last时返回第一个文件的错误?

时间:2016-01-27 14:20:04

标签: ruby-on-rails mongodb mongoid

我遇到了mongoid的错误,当我调用方法last

时会返回第一个文档
class Post
  include Mongoid::Document
end

Post.create
Post.create
Post.first == Post.last #=> true

版本信息:

  • mongoid:“5.0.2”
  • mongodb:v3.2.1
  • Rails 4.2.5

2 个答案:

答案 0 :(得分:2)

这不是Mongoid中的错误,这是您对firstlast方法的期望中的错误。来自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)

希望有所帮助:)