代码之家  ›  专栏  ›  技术社区  ›  shanyu

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

  •  1
  • shanyu  · 技术社区  · 17 年前

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

    query=foo.all().order('- 钥匙

    我想拿到第N张唱片。实现这一目标最有效的方法是什么?

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

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

    编辑:n>1000

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   Nick Johnson    17 年前

    在任何DBMS中都没有有效的方法来实现这一点。在每种情况下,您都必须至少按顺序读取索引记录,直到找到第n个记录,然后查找相应的数据记录。这或多或少是在GAE中FETCH(计数、偏移量)所做的,额外的限制是1000条记录。

    一个更好的方法是保留一个“书签”,它由您为最后一个检索到的实体排序的字段的值和实体的键组成。然后,当您希望从停止的位置继续时,可以将字段的值添加为不相等查询的下限,并跳过记录,直到匹配或超过最后看到的值。

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

        2
  •  2
  •   user101852    17 年前

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

    查询类提供fetch witch接受限制和偏移量 在您的案例1和n中

    提取的运行时间随偏移量+限制线性增长。

    因此,在您的案例中优化的唯一方法是确保您想要的记录 访问通常更接近数组的开头。

    你可以使用 query.filter('key=',n) 查询。

    它将返回第一个匹配项,其中键为n