MongoDB:在任一方向上使用限制和跳过复杂的排序顺序

时间:2013-12-13 01:41:09

标签: mongodb mongoid mongoid3

我有一个使用多个字段的复杂排序顺序。 “入口对象”是查询定义的第一个批次中的第一个项目。我正在尝试创建一个无限卷轴,其中输入项目显示在顶部 - 向下滚动按预期工作并向上滚动显示项目之前的项目。

在“username”之类的唯一字段上使用简单排序非常简单,但在我的情况下,排序至少需要三个字段才能生成唯一排序。

撤销排序顺序也不是问题。

问题是如何定义条目对象并使用skip和limit在排序集合中获取它之前和之后的项目。 afaik不允许跳过负值。

使用mongoid和Rails,排序由:

定义

scope :rating_watchable, order_by(avg_rating: :desc, release_date: :desc, title: :asc)

从以下返回的第一个对象是位置0处的'entry object':

Object.rating_watchable.where(:avg_rating.gte => 3).skip(0).limit(BATCH_SIZE)

这最后一个查询正确地返回对象,如果我颠倒了排序顺序,我可以按正确的顺序获取对象,但我想不出如何使用相对的“where”子句定义相同的条目对象。我需要这个以使跳过/限制以相反的顺序正常工作。

肯定会有这样的负面跳过:

Object.rating_watchable.where(:avg_rating.gte => 3).skip( -BATCH_SIZE * batch_num ).limit(BATCH_SIZE)

也许我错过了一些更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

潜在的问题是你有一个排序顺序,并且你试图在排序顺序中找到一个对象的索引(条目对象)。根据定义,您必须从排序中获取结果,以便按排序顺序获取条目对象的索引。所以......

1)然后获取条目对象的_id 2)从排序中获取_id,然后 3)在sort _id的

中找到条目对象_id的索引

鉴于上述情况,您现在可以使用skip和limit来显示从条目对象开始的初始页面,并计算适当的跳过和限制值,以便按排序顺序中的一个或多个页面向前或向后移动。

MongoDB允许您从文档中“选择”选定的顶级字段,使用此功能选择_id,这样您就不必为完整的排序结果反序列化完整文档的开销,请参阅{{3在Mongoid中,这是使用Criteria#pluck进行查询,在Moped中这是#select,请参阅http://docs.mongodb.org/manual/tutorial/project-fields-from-query-results/

希望这会有所帮助。