假设我在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时,查询是从该页面的第一条记录开始获取记录。
答案 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
键返回第一个匹配项