查询DocumentDb

时间:2016-09-02 01:52:31

标签: azure azure-cosmosdb

注意:我向previously提出了一个非常类似的问题,但对于我正在寻找的内容还不够明确,并且过于激进地标出了答案。我正在寻找一个特定点确认的是/否。

我想构建一个自动化作业,通过按计划查询DocumentDb来查找DocumentDb文档的离线处理,查找自上次执行检查以来发生过更改的文档。

鉴于DocumentDb中可用的元数据,看起来这样做的方式如下:

  • 第一次运行流程时,检索所有文档。
  • 将结果集中的最大_ts值存储为highWatermark,并将具有该特定值的文档的ID和eTag存储为_ts值。
  • 对于每个后续查询,请包含“WHERE _ts> = highWatermark”子句。过滤掉以前记录的eTag未更改的文档。结果是自上次查询运行以来所有更改的集合。

我的问题是这有效吗? 保证这不会错过任何文件吗?据我所知,它归结为DocumentDb实现中_ts周围的事务语义,没有记录到这个详细程度。我想知道是否可以保证没有文件可以使用更低的_ts值更新,而不是在返回最近更改的查询期间返回的最大 _ts值该集合中的文件。

由David的评论提示编辑

更准确一点,有几个具体的场景:

  1. 如果两个文档D0和D1的更新应用于T0和T1的数据库(其中T1> T0,任意查询可能返回D0而不是D1),是否有可能是D0._ts> ; D1._ts?严格大于使用是故意的,因为我提议的实现处理接收相同_ts的多个更新,但只有一些更新被查询检索。
  2. 假设我在时间T0执行我的实现查询,并且查询需要很长时间才能运行,并且/或者需要一些ExecuteNextAsync()调用来从服务器中提取多个批次。在此期间,更新2个不同的文档(D1和D2),获得T1和T2的_ts值(其中T1

1 个答案:

答案 0 :(得分:1)

使用默认一致性时,无法保证此功能,因为具有较低_ts的文档可以稍后显示。但是,如果您可以保证更新请求相隔足够远(例如60秒),则风险非常低。

我不认为大卫的边缘情况是一种担忧,只要你把每个文件都用更高的_ts视为新的。

您可能还想考虑使用像Richard Snodgrass'这样的附加方法。时间模型。这使得幂等性语义更容易。