2011-03-25 49 views
2

我有Images存储在mongoDB中。它们按“created_at”排序。用mongoId获取“previous”文档

现在,当我打开一个单一的项目与Image.find("documentID")我要访问之前的文件和一个仅这一项后,基于created_at顺序。

对于这一点,我有两个方法和image.rb一个default_scope:

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 

是否有MongoDB中原生的方式在当前文档之前和之后访问该文档?

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

编辑:在 “previous_image” 应最后使用,不是第一。这解决了“跳过”项目的错误。不过,关于实现这一点的正确方法的问题依然存在。

回答

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 

该方法利用蒙戈id的顺序性。

+0

我实现了一个有点类似的解决方案,因为你的代码('{$ lt:mongoid}')给出了语法错误。 – berkes 2011-03-28 10:50:58

+1

我来自PHP世界,尽力让Ruby尽可能多地友好。 – jhavrda 2011-03-28 19:18:32

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