1

假设我在 GAE 中有模型 Foo 和这个查询:

query = Foo.all().order('- key ')

我想获得第 n 条记录。实现这一目标的最有效方法是什么?

如果排序属性不是唯一的,解决方案是否会中断,例如下面的:

query = Foo.all().order('-颜色')

编辑:n > 1000

编辑 2:我想开发一种友好的分页机制来显示可用的页面(例如第 1 页、第 2 页、... 第 185 页),并且在查询字符串中需要“?page=x”,而不是“?bookmark =XXX”。当 page = x 时,查询将从该页面的第一条记录开始获取记录。

4

2 回答 2

3

没有有效的方法来做到这一点 - 在任何 DBMS 中。在每种情况下,您至少必须按顺序读取索引记录,直到找到第 n 个,然后查找相应的数据记录。这或多或少是 fetch(count, offset) 在 GAE 中所做的,另外还有 1000 条记录的限制。

更好的方法是保留一个“书签”,其中包含您为检索到的最后一个实体排序的字段的值和实体的键。然后,当您想从上次中断的地方继续时,可以将字段的值添加为不等式查询的下限,并跳过记录,直到匹配或超过您看到的最后一条。

如果您想为用户提供“友好”的页面偏移量,您可以使用 memcache 来存储起始偏移量和书签 (order_property, key) 元组之间的关联。生成页面时,插入或更新最后一个实体的书签。当你获取一个页面时,如果它存在就使用书签,或者通过使用偏移量进行查询来生成它——如果偏移量足够高,可能会进行多个查询。

于 2009-05-05T22:14:26.003 回答
2

查询类的文档可以在以下位置找到: http ://code.google.com/appengine/docs/python/datastore/queryclass.html#Query

查询类提供 fetch 女巫在您的案例 1 和 n 中需要一个限制和一个偏移量

fetch 的运行时间随着 offset + limit 线性增长

因此,在您的情况下进行优化的唯一方法是确保您最常要访问的记录更接近数组的开头。

你可以使用 query.filter('key = ', n) query.get()

这将返回键为 n 的第一个匹配项

于 2009-05-05T22:01:27.843 回答