【问题标题】:how to get the n-th record of a datastore query如何获取数据存储查询的第 n 条记录
【发布时间】:2009-05-05 20:14:11
【问题描述】:

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

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

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

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

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

编辑:n > 1000

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

【问题讨论】:

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


    【解决方案1】:

    没有有效的方法来做到这一点 - 在任何 DBMS 中。在每种情况下,您至少必须按顺序读取索引记录,直到找到第 n 个,然后查找相应的数据记录。这或多或少是 fetch(count, offset) 在 GAE 中所做的,另外还有 1000 条记录的限制。

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

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

    【讨论】:

    • 抱歉,我没有充分阐明我的意图。请重新检查我的问题,我进行了编辑。
    • 用更多细节更新了我的答案。
    【解决方案2】:

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

    查询类提供 fetch 巫婆带一个限制和一个偏移量 在你的情况下 1 和 n

    fetch 的运行时间随着 offset + limit 线性增长

    因此,在您的情况下进行优化的唯一方法是确保您想要的记录 最常访问的位置更接近数组的开头。

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

    这将返回第一个匹配键为 n 的匹配项

    【讨论】:

    • 抱歉,我没有充分阐明我的意图。请重新检查我的问题,我进行了编辑。
    • 您不能对 'key' 进行过滤以通过键进行过滤 - 您必须使用 key 伪属性。无论如何,这样的过滤器是没有意义的——它只会返回一个结果,所以使用 Model.get 会更有效。
    猜你喜欢
    • 2010-11-09
    • 2016-07-15
    • 2013-12-31
    • 2021-12-25
    • 2021-05-07
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多