NDB数据存储查询游标和索引问题



我们正在使用ndb Datastore,python,标准Google App Engine。我们想使用查询游标。但是为了根据这里和这里工作,看起来我们需要实现datastore_model.query((.order(-datastore_model.key(。

例如,在我们的查询中,我们有

teacher_model_query     = teacher_model.query(ndb.AND(
ndb.GenericProperty('signinout_time') >= signinout_time_start, 
ndb.GenericProperty('signinout_time') <= signinout_time_end))
teacher_query_forward = teacher_query.order(ndb.GenericProperty('signinout_time')).order(teacher__model.key)
teacher_query_reverse = teacher_query.order(-ndb.GenericProperty('signinout_time')).order(- 
teacher__model.key)

不幸的是,这意味着我们必须为此创建一个新索引

- kind: teacher_model
properties:
- name: signinout_time
direction: desc
- name: __key__
direction: desc

这占用了每个项目 200 个索引的限制。您能否确认我们需要 order(-datastore.model.key( 才能使查询光标在相反方向上工作?我们如何在不需要创建其他索引的情况下执行 Query 游标?

仅当你的应用需要能够在查询结果页中向后移动时,才需要创建此类索引。这可能是需要的,例如,如果您提供页面导航功能并且您允许此类导航到前一页面。

但是,如果您仅使用游标将处理负载拆分为较小的批次,则通常不需要此类功能 - 在这种情况下,您只沿一个方向导航。

更改我以前的帖子,因为它是完全错误的。

据 https://cloud.google.com/datastore/docs/concepts/queries#limitations_of_cursors

例外情况是,如果原始查询的最终排序顺序为 on __钥匙__。在这种情况下,可以在反向查询中使用游标,反向查询是每个排序顺序颠倒的原始查询。反之亦然 查询可以修改开始游标、结束游标、偏移量和限制。

因此,似乎最后一个排序字段必须是一个键,并且需要另一个具有所有排序颠倒的索引。这将使用两个复合索引。

我能想到的避免这种情况的一种方法是在分页发生时将所有游标存储为堆栈。这可以在客户端完成。然后,当用户向后导航或跳转到特定的上一页时,可以使用关联的光标始终向前移动。假设您的页面大小为 25。然后,您将在 25、50、75 和 100 处生成一个游标。然后,如果用户想要返回到 50,您可以选择关联的光标并生成从 50 到 75 的行,该行仅向前迭代。

最新更新