1

假设我在GAE模型Foo和这个查询:如何让数据存储区查询的第n个记录

查询= Foo.all()命令(“ - ”)

我想获得第n个记录。什么是最有效的方法来实现呢?

请问解破,如果排序属性不是唯一的,比如下面这个:

查询= Foo.all()命令( ' - 颜色')

编辑:短语> 1000

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

回答

3

的一键返回第一场比赛没有有效的方式来在任何DBMS中执行此操作。在任何情况下,您都必须至少按顺序读取索引记录,直到找到第n个记录,然后查找相应的数据记录。这或多或少是GAE中的提取(计数,偏移),具有1000条记录的额外限制。

一个更好的方法是保留一个'书签',它包含您检索的最后一个实体的字段值和实体的键。然后,当您想要从停止的位置继续时,可以将该字段的值添加为不等式查询的下限,并跳过记录,直到您匹配或超出您所看到的最后一个。

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

2

的查询类的文档,可以发现在: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query

查询类提供获取巫婆需要一个极限,你的情况1偏移 和n

的取长的运行时间线性与偏移+限制

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

你可以使用 query.filter( '键=',N) query.get()

这将有n

+0

对不起,我没有充分澄清我的意图。请重新检查我的问题,我做了一个编辑。 – shanyu 2009-05-06 05:32:52

+0

您无法对'key'进行过滤以通过键进行过滤 - 您必须使用__key__伪属性。无论如何,这样的过滤器没有意义 - 它只会返回一个结果,所以使用Model.get会更有效率。 – 2009-05-07 23:19:53

相关问题