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

ndb datastore query cursor and indexing issues

我们正在使用 ndb 数据存储,python,标准 google 应用引擎。我们想使用查询游标。但是为了使它根据 here and here 工作,看起来我们需要实现 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 个索引的限制。您能否确认我们需要顺序 (-datastore.model.key) 才能使查询游标反向工作?我们如何在不需要创建额外索引的情况下执行查询游标?

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

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

改变我之前的 post 因为它是完全错误的。

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

An exception is if the original query's final sort order was on __key__. In that case, you can use the cursor in a reverse query, which is the original query with each sort order reversed. The reverse query can modify the start cursor, end cursor, offset, and limit.

所以看起来最后一个排序字段必须是一个键,并且需要另一个所有排序都颠倒的索引。这将消耗两个复合索引。

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