获取“上一个”带有 mongoId 的文档

发布于 2024-10-26 04:42:00 字数 742 浏览 1 评论 0原文

我将 Images 存储在 mongoDB 中。它们按“created_at”排序。

现在,当我使用 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 中是否有本地方法来访问当前文档之前和之后的文档?

是否有更好的方法在 Rails 中使用 mongoID 创建此类命名范围来访问上一个和下一个项目,同时考虑性能(不要对一张图像查询三次)?

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

I have Images stored in mongoDB. They are sorted by "created_at".

Now, when I load a single item with Image.find("documentID") I want to access the document just before and the one just after this one, based on the created_at order.

For that, I have two methods and a default_scope in 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

Is there a native way in mongoDB to access the document before and after the current document?

Is there a better way to create such named scopes with mongoID in rails to access previous and next items, also considering performance (not querying three times for one image)?

Edit: The "previous_image" should use last, not first. That solves the bug of "skipping" items. The questions about the proper way to achive this remain, though.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

埖埖迣鎅 2024-11-02 04:42:00

您可以尝试这样的方法:

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

这种方法利用 Mongo id 的顺序。

You may try something like this:

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

This approach utilizes sequentiality of Mongo ids.

五里雾 2024-11-02 04:42:00

您可以根据 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

You could try something like the following, based on jhavdra's response, but rewritten for Mongoid syntax.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文