Получить "предыдущий" документ с помощью mongoId - PullRequest
2 голосов
/ 25 марта 2011

У меня Images хранится в mongoDB.Они отсортированы по "creation_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

Есть ли в mongoDB собственный способ доступа к документу до и послетекущий документ?

Есть ли лучший способ создать такие именованные области с mongoID в рельсах для доступа к предыдущим и следующим элементам, также учитывая производительность (не запрашивая три раза для одного изображения)?

Редактировать : «предыдущий_изображение» должно использовать последнее, а не первое.Это решает проблему «пропуска» предметов.Однако вопрос о том, как этого добиться, остается.

Ответы [ 2 ]

6 голосов
/ 19 мая 2013

Вы можете попробовать что-то вроде следующего, основываясь на ответе jhavdra, но переписанное для монгоидного синтаксиса.

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
6 голосов
/ 25 марта 2011

Вы можете попробовать что-то вроде этого:

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

Этот подход использует последовательность идентификаторов Монго.

...