使用mongoId获取"previous"文档

ber*_*kes 2 ruby-on-rails mongodb mongoid

Images存储在mongoDB中.它们按"created_at"排序.

现在,当我加载一个项目时,Image.find("documentID")我想要根据订单访问之前的文档和刚好在此文档之后的文档created_at.

为此,我有两个方法和一个default_scope image.rb:

default_scope asc(:created_at)     

def previous_image
  self.class.last(:conditions => {:created_at.lt => created_at})
end

def next_image
  self.class.first(:conditions => {:created_at.gt => created_at})
end
Run Code Online (Sandbox Code Playgroud)

在当前文档之前和之后,mongoDB中是否有本地方式来访问文档?

有没有更好的方法来创建这样的命名范围与轨道中的mongoID访问上一个和下一个项目,还考虑性能(不查询一个图像三次)?

编辑:"previous_image"应该使用last,而不是first.这解决了"跳过"项目的错误.但是,关于实现这一目标的正确方法的问题仍然存在.

小智 6

你可以尝试这样的事情:

def previous_image mongoid
  self.class.find(:conditions => {:_id => {$lt: mongoid}}).sort({:_id=>-1}).limit(1)
end

def next_image mongoid
  self.class.find(:conditions => {:_id => {$gt: mongoid}}).sort({:_id=>1}).limit(1)
end
Run Code Online (Sandbox Code Playgroud)

这种方法利用了Mongo id的顺序性.


ste*_*tef 6

您可以根据jhavdra的响应尝试类似下面的内容,但会重写Mongoid语法.

def previous_image
  self.class.where(:_id.lt => self._id).order_by([[:_id, :desc]]).limit(1).first
end

def next_image
  self.class.where(:_id.gt => self._id).order_by([[:_id, :asc]]).limit(1).first
end
Run Code Online (Sandbox Code Playgroud)