自上次查询以来,如何查询所有新的和更新的文档?

时间:2019-05-17 12:31:36

标签: azure-cosmosdb

我需要查询集合并返回自上次查询以来所有新的或更新的文档。集合按userId进行分区。我正在寻找一个可以使用(或创建和使用)的值,该值将有助于简化此查询。我考虑过使用_ts

SELECT * FROM collection WHERE userId=[some-user-id] AND _ts > [some-value]

_ts的问题在于它不够精细,查询可能会错过另一个客户端在同一秒内进行的更新。

在SQL Server中,我可以使用另一个表中的IDENTITY列来完成此操作。我们将其称为表version。在事务中,我将在version表中创建一个新行,对另一个表进行更新(包括使用新值更新version列。要查询新行和更新行,请使用这样的查询:

SELECT * FROM table WHERE userId=[some-user-id] and version > [some-value]

我如何在Cosmos DB中做类似的事情?更改Feed似乎是正确的选项,但是由于无法查询更改Feed,因此我不确定该如何处理。

如果有关系,(网络/移动)客户端将通过Web API连接到Cosmos DB中的数据。我可以控制整个堆栈-从客户端到后端。

3 个答案:

答案 0 :(得分:0)

作为此link中的声明:

  

今天,您可以在变更Feed中看到所有操作。功能性   您可以在其中控制更改供稿,以用于特定操作,例如   仅更新而不是插入尚不可用。您可以添加一个“软   标记”上的内容进行更新,并根据该内容进行过滤   处理变更Feed中的项目。目前,更改供稿未记录   删除。与上一个示例类似,您可以在   被删除的项目,例如,您可以添加   属性中名为“已删除”的属性,并将其设置为“ true”并设置   该项目上的TTL,因此可以自动删除。你可以阅读   历史项目的更改提要,例如,已添加的项目   五年前。如果未删除项目,则可以阅读更改   进食到容器的原点。

更改供稿不适用于您的要求。

我的想法:

使用Azure Function Cosmos DB Trigger收集您特定的cosmos集合中的所有操作。遵循此document,将azure函数的输入配置为cosmos db,然后遵循此document,将输出配置为azure队列存储。

获取已更改项的ID并将其作为消息发送到队列存储中。要查询已更改项时,只需从队列中查询消息以在特定的单位时间使用它们,然后清除整个队列即可。 。不会错过任何物品。

答案 1 :(得分:0)

使用这种方法,您可以获取添加/更新的文档并将参考值(_ts和id字段)保存在某处(例如blob)

SELECT * FROM collection WHERE userId=[some-user-id] AND _ts > [some-value] and id !='guid' order by _ts desc

这是一种类似的方法,我们用于从Eventhub读取数据并将检查点信息(时期号,序列号和偏移值)存储在blob中。一次只有一个函数可以租用该blob。

如果使用ChangeFeed,则可以创建侦听器(函数或作业)以侦听集合中的所有添加/更新数据,并且可以将这些值存储在某个集合中,同时保存数据时可以在每个文档上添加“标识/版本”字段。这种方法可能会增加您的波斯菊数据库账单。

答案 2 :(得分:0)

这是交易一致性级别的含义:https://docs.microsoft.com/en-us/azure/cosmos-db/consistency-levels

选择强一致性,您的查询将始终返回最新的写入内容。

  

强:强一致性提供线性化保证。的   保证读取返回的最新提交版本   项目。客户端永远不会看到未提交或部分写入。用户是   始终保证可以读取最新提交的内容。