MongoDB:使用限制并沿任一方向跳过复杂的排序顺序

问题描述 投票:2回答:1

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

在诸如“用户名”之类的唯一字段上使用简单排序非常容易,但是在我的情况下,排序至少需要三个字段才能产生唯一的排序。

倒序排序也不是问题。

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

使用mongoid和Rails的排序方式是:

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

从下面返回的第一个对象是位置0处的“入口对象”:

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)

也许我缺少更好的方法?

mongodb mongoid mongoid3
1个回答
0
投票

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

1)获取入口对象的_id,然后2)从排序中获取_id,然后3)在排序_id的

中找到条目对象_id的索引

鉴于上述,您现在可以使用跳过和限制来显示从输入对象开始的初始页面,并计算适当的跳过和限制值以按排序顺序在一个页面或多个页面之间前进或后退。

MongoDB允许您从文档中“投影”选定的顶级字段,使用此功能选择_id,这样您就不必为将完整文档反序列化以得到完整的排序结果而支付开销,请参阅http://docs.mongodb.org/manual/tutorial/project-fields-from-query-results/-在Mongoid中,这是使用Criteria#pluck查询的,在Moped中是#select,请参见http://mongoid.org/en/mongoid/docs/querying.html

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.