当指向实体的光标得到更新但在列表

时间:2017-09-11 14:55:11

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

我使用谷歌数据存储来获取用户的数据:

这就是我想要做的事情:

  1. 更新数据时,其updated_at [indexed]属性将设置为当前时间戳。
  2. 我在 升序 中查询updated_at上的数据,并返回存储光标供以后使用。
  3. 现在,用户已更新最后一个实体(当前指向哪个光标),未添加或更新其他数据
  4. 现在我希望在下一个查询中返回最后一个实体(使用旧的游标),因为它已更新,现在有一个新的updated_at时间戳。
  5. 但事实并非如此,我没有看到(我的结果是空列表)现在我完全丢失了这个更新,因为查询将返回除了更新的最后一个实体之外的所有其他对象。
  6. 我做错了什么或是这样的?如果这是自然行为,那么获取最新实体的首选方法是什么?

3 个答案:

答案 0 :(得分:1)

披露此答案仅代表我了解GAE数据存储的工作原理。现实可能不同。但无论如何,解决方案应该可行。

您可以将游标视为指向链接列表中节点的指针。 基本上它只存储用于获取它的查询以及" last / current"实体。在数据存储区中更新实体时,无法更新游标。

当您更改实体的字段updated_at时,它不会更改存储在光标处的密钥。因此,如果更新filtred / ordered属性,则旧光标指向同一节点,但位于不同的"链中#34;。

解决方案:您可以存储最后一个( max updated_at并使用.filter('updated_at >', last_updated_at)查询数据,而不是存储光标。这样你就会:

  1. 如果updated_at已更改(增加)
  2. ,请在结果中获取您的实体
  3. 小一点&更具可读性"光标"传遍。

答案 1 :(得分:1)

将数据存储区游标视为指向“实体之间”,如“此处是继续扫描的位置”。

documentation表示“...一个游标,它是一个不透明的base64编码字符串,用于标记检索到的最后一个结果的索引位置”,但最后的结果将不会被重新检索。

答案 2 :(得分:0)

这是预期的行为,因为数据是在创建光标和使用光标之间修改的。来自Cursors and data updates

  

...如果查询的结果在使用游标之间发生变化,那么   查询只会注意>光标后中发生的更改。   ...