按Google App Engine中的不同字段进行筛选和排序

时间:2012-03-24 22:04:48

标签: python google-app-engine

以下代码在执行时会产生First ordering property must be the same as inequality filter property错误,因为您无法按字段排序,而不是过滤器。

q = Score.all()
q.filter("levelname = ", levelname)
q.filter("submitted >", int(time.time()) - (86400*7))
q.order("-score")
scoreList = q.fetch(10)

我需要做的是找到不到一周的前10个分数。可能有成千上万(如果不是更多)分数,所以我不能只获取它们并在python中排序。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

一般来说,每次出现计数问题时,大家都会一致认为,对于GAE,你应该预先计算一切。我接近前十名分数的具体要求的方法是创建一个持有最高分的实体,并在新分数超过前10分时更新职位。

计算分数时,您可以查询有多少其他分数大于计算得分。如果计数超过10,则无需更新分数。这将是大部分时间。如果计数等于或大于10,您需要更新订单,这样您就可以获得前10名并根据需要插入新分数。

为了处理时间组件,我会运行一些进程,每天进行检查以查看是否应该从前10名中逐出一个分数,如果是,请抓住下一个最高分来替换它。

以下是关于类似主题的一系列答案,其中涉及适用于GAE数据存储区的设计模式和逻辑:What's the best way to count results in GQL?

答案 1 :(得分:0)

正如Sologoub所提到的,预计算是可行的方法。

但是,你可以使用许多相等的过滤器,因此保留单独的最高分数列表的替代方法可以是让每个实体都有一个标志(比如一个布尔值)来说明它是否有资格成为最高分。分数列表(在您的情况下,不超过一周),并有一个每日cron作业,检索具有资格标志的所有实体的列表,检查日期,并在需要时更改标志。

这会花费更多的存储空间(每个实体多一个字段),但我认为有一个优点是您可以动态选择要返回的最高分数。 (你也可以有几个这样的标志,比如一个用于所有时间的高分,一个用于上周,等等。)