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

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

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

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

query = Foo.all()。order(' - color ')

编辑:n> 1000

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

有帮助吗?

解决方案

在任何DBMS中都没有有效的方法。在每种情况下,您必须至少按顺序读取索引记录,直到找到第n个,然后查找相应的数据记录。这或多或少是GAE中fetch(count,offset)的作用,附加限制为1000条记录。

更好的方法是保留一个“书签”,包括您为所检索的最后一个实体订购的字段的值以及实体的密钥。然后,当您想从中断的地方继续时,可以将字段的值添加为不等式查询的下限,并跳过记录,直到您匹配或超过您看到的最后一个。

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

其他提示

可以在以下位置找到Query类的文档: http://code.google.com/appengine/docs/蟒/数据存储/ queryclass.html#查询

查询类提供了获取限制和偏移量 在你的情况1和n

获取的运行时间与偏移+限制

呈线性增长

所以在你的情况下优化的唯一方法是确保你想要的记录 最常访问的是更接近数组的开头。

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

将使用n

键返回第一个匹配项
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top