我需要查询集合并返回自上次查询以来所有新的或更新的文档。集合按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中的数据。我可以控制整个堆栈-从客户端到后端。
答案 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
选择强一致性,您的查询将始终返回最新的写入内容。
强:强一致性提供线性化保证。的 保证读取返回的最新提交版本 项目。客户端永远不会看到未提交或部分写入。用户是 始终保证可以读取最新提交的内容。