【问题标题】:GAE Datastore - Is there a next page / Are there x+1 entities?GAE 数据存储区 - 是否有下一页/是否有 x+1 个实体?
【发布时间】:2011-04-05 13:16:33
【问题描述】:

目前,要确定是否存在下一页实体,我使用以下代码:

q = Entity.all().fetch(10)
cursor = q.cursor()
extra = q.fetch(1)

has_next_page = False
if extra:
  has_next_page = True

但是,就执行“额外”查询所需的时间而言,这是非常昂贵的。我需要在10个结果后提取光标,但我需要取11个看看是否有后续页面。

谁有更好的方法?

【问题讨论】:

  • 数据存储 API 缓存结果,我不记得了吗?如果是这样,可能会获取 11,检查计数,然后从新查询中获取 10 以获取游标。如果第一次提取的结果被缓存,那么第二次提取就会很便宜。
  • 我不这么认为。我会检查的。
  • 不,我也不认为是这样。我想你可以回到非光标技巧:记录你排序依据的第 11 个实体的值,然后在下一页上对其进行 >= 过滤。特别是。如果多个实体不可能具有该字段的相同值。

标签: python database google-app-engine scalability google-cloud-datastore


【解决方案1】:

如果您立即获取 11 件商品,您只需多获取 1 件商品即可知道是否有下一页。您可以只显示前 10 个结果,并将第 11 个结果仅用作“下一页”指示符。

【讨论】:

  • 我一开始也是这么想的,但是在前面查询 11 并不会产生一个位于提问者想要的第 10 项之后的光标。
  • 但是我的光标(我用它作为下一页的起点)将无效(它将在第 12 项开始下一个查询)。这将导致每页缺少一个实体。
  • @Matt,只需将内存缓存中的“额外项目”放在适当的唯一键处,然后在“下一页”上检查该唯一键处是否有内容(如果有,请将其删除并放在前面到从游标中获取的集合)。
  • @Matt H:这确实是一个缺点,但很容易解决。正如 Alex Martelli 已经解释的那样。
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
相关资源
最近更新 更多