我正在尝试在数据存储中查询过去一周(日期字段)登录的得分最高的 100 位用户。
List<User> users = ofy().load().type(User.class)
.filter("date >", date).order("date")
.order("-points").limit(100).list();
它似乎忽略了按点的最终排序,而是返回按日期排序的列表。
如果我删除日期过滤器并排序,那么我会得到按点很好地排序的列表,但包括一周多前登录的用户。
我仔细阅读了文档,它似乎允许包含不等式过滤器和多种排序的查询。
有什么想法我做错了吗?
以下是文档中的一些相关注释:
由于 App Engine 数据存储区执行查询的方式,如果查询指定对某个属性指定不等式过滤器并对其他属性指定排序顺序,则不等式过滤器中使用的属性必须排在其他属性之前。
...如果查询指定一个或多个不等式过滤器以及一个或多个排序顺序,则第一个排序顺序必须引用不等式过滤器中指定的相同属性。
您所观察到的是应用程序引擎使用的基于索引的查询的标准预期行为。在过滤时,如果您应用不等式过滤器(只能在查询中的一个属性上使用),那么当您有多个排序顺序时,第一个排序将针对该属性,然后可以基于其他属性进行进一步排序。为了基于日期的不等式过滤器进行查询并按点排序,数据存储将使用如下所示的索引,其中日期属性按升序或降序排列:
day 1 - 100
day 2 - 30
day 2 - 90
day 2- 10
day 3 - 50
day 4 - 40
day 5 - 60
现在,如果您使用 day > day1 的不等式过滤器进行查询,那么查询将搜索上面的索引并返回下面的结果,即使您没有明确提及,这些结果也已经按照日期排序:
day 2 - 30
day 2 - 90
day 2- 10
day 3 - 50
day 4 - 40
day 5 - 60
现在,如果您正在对日期使用不等式过滤器进行查询,并在点上添加排序顺序,那么就像对已按日期排序的上述结果应用附加排序一样。这就是为什么您被迫明确提及日期作为第一排序顺序(因为默认情况下它已经存在),然后提及点作为第二排序顺序。
结果会像下面这样。查看第 2 天完成的排序:
day 2 - 10
day 2 - 30
day 2- 90
day 3 - 50
day 4 - 40
day 5 - 60
因此,如果您想实现逻辑,您需要从应用程序引擎检索数据并进行一些额外的排序,如下所示:
1,使用日期不等式过滤器获取,然后在客户端根据点进行适当的排序以获得前 100 个。
2、根据点的降序索引获取排名靠前的结果(大约300个),然后根据客户端的日期过滤它们以获得所需的100个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)