如何获取数据存储区查询的第n条记录

时间:2009-05-05 20:14:11

标签: python google-app-engine google-cloud-datastore custompaging

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

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

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

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

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

编辑:n> 1000

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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

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

呈线性增长

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

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

将使用n

键返回第一个匹配项