App Engine Java高级查询类型

时间:2010-02-06 22:41:41

标签: java google-app-engine google-cloud-datastore

我意识到这里已经有很多关于查询App Engine数据存储区的问题,但我想就我的具体案例得到意见。

我正在查询分数以建立一个高分表,所以我希望它们按分数降序排列。现在,两个分数可能具有相同的分数值,因此无法基于此值进行分页,因为您最终可能会根据页面的过滤器跳过分数。

我想围绕动态日期构建查询。例如,过去一个月的前10名。最好的方法是什么?

我显然不希望每次都能分页。我是否需要将这些分数加载到内存缓存中并在提交的分数大于前10中的分数时进行更新?这没有意义,因为我必须提前定义我的时间范围,但是设置一个cron来每天刷新它以获得已经达到时间限制的分数是可行的。 这可以有效地动态完成吗?另一个选择是每隔N小时或者某个时间让一个cron运行所有分数,但我真的更愿意远离需要这样做。

那里有文献可以帮助我做出这些决定吗?

2 个答案:

答案 0 :(得分:0)

所以这是我开始工作的一个解决方案,但可能不是首选的方法。

在我的Score课程中,我添加了一个Long变量。当我设置日期时,我会删除小时,分钟,秒和毫秒并执行getTime()。

当请求发生N天或N个月的分数时,我将在查询字符串上生成相当多的平等检查:“dateAsLong == N天前|| dateAsLong == N - 1天前”等等等。

在尝试.execute()之前我遇到“非法争论”之前,这个请求最多可以工作29天。我假设我在查询长度或过滤器数量方面遇到了某种最大限度。任何更长的时间都需要拆分查询,这是非常可行的。然后可以获取并附加列表。

这样做的限制是请求所花费的时间和CPU。查询过去29天时,请求大约需要550毫秒和750毫秒的CPU时间。

答案 1 :(得分:0)

三个选项:

  1. 您仍然可以对'天真'方式进行分页 - 所有查询都将其键作为隐式最终排序顺序,因此您只需将密钥包含在您的分页中。
  2. 使用新查询光标支持
  3. 执行this library的作者所做的事情,并建立一个得分条目树。