这么说是否正确com.google.appengine.api.datastore.Cursor
只是将索引位置存储到 GAE 数据存储索引中?
游标耐用吗?也就是说,我可以永久存储游标并一次又一次地重复使用它,并确定如果它指向索引中的第 5000 个位置,那就是它永远指向的位置吗?
如果索引缩减到少于 5000 个条目怎么办?使用此游标会导致错误或只是不返回任何内容吗?
对于较大的索引(例如 100,000 个或更多条目),我是否可以首先为每个 5000 个位置的倍数获取游标(例如),存储它们,然后使用这组游标以 Map/Reduce 方式执行某些工作?
我实际上使用的是 Objectify,而不是直接使用 DS,但据我所知,这不会影响游标相对于索引的属性。
游标仅在所进行的原始查询的上下文中才有意义。它们并不完全是索引位置/偏移量。从游标和数据更新 https://cloud.google.com/appengine/docs/java/datastore/query-cursors#cursors_and_data_updates:
光标的位置定义为结果列表中的位置
最后结果返回后。光标不是相对位置
列表(不是偏移量);它是 Cloud Datastore 的标记
开始索引扫描结果时可以跳转。如果结果为
查询在游标的使用之间发生变化,查询仅注意到变化
出现在光标之后的结果中。如果之前出现新的结果
查询时光标的位置,查询时不返回
获取游标后的结果。类似地,如果一个实体不是
查询结果较长但已出现在光标之前,
光标后出现的结果不会改变。如果最后的结果
返回已从结果集中删除,游标仍然知道如何
找到下一个结果。
也来自游标的限制 https://cloud.google.com/appengine/docs/java/datastore/query-cursors#limitations_of_cursors:
游标受到以下限制:
- 游标只能由执行原始查询的同一应用程序使用,并且只能用于继续同一查询。使用光标
在后续的检索操作中,您必须重构
与原始查询完全相同,包括相同的实体种类、祖先
过滤器、属性过滤器和排序顺序。这是不可能的
使用游标检索结果,而无需设置相同的查询
它最初是生成的。
- 由于 NOT_EQUAL 和 IN 运算符是通过多个查询实现的,因此使用它们的查询不支持游标,也不支持游标。
使用 CompositeFilterOperator.or 构造的复合查询
方法。
- 对于使用不等式过滤器或对具有多个值的属性进行排序顺序的查询,游标并不总是按预期工作。
这种多值属性的重复数据删除逻辑并不
在检索之间持续存在,可能会导致相同的结果
回来过不止一次。
- 新的 App Engine 版本可能会更改内部实现细节,从而使依赖于它们的游标失效。如果一个应用程序
尝试使用不再有效的游标,Cloud Datastore
引发 IllegalArgumentException(低级 API),
JDOFatalUserException (JDO) 或 PersistenceException (JPA)。
如果您的数据没有改变,您可能可以以映射/归约方式使用游标(通过恢复原始查询),包括预先获取它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)