2011-03-25 72 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