Cosmos DB(DocumentDB API):通过分区ID查询最新文档的有效方法?

JTW*_*JTW 6 azure-cosmosdb

我有一个Cosmos DB集合,其中包含基于设备ID的多个分区.我经常遇到需要通过特定设备ID检索最新文档的用例.我目前正在使用SELECT TOP 1DocumentDB API中提供的功能,如下所示:

SELECT TOP 1 *
FROM c
WHERE c.deviceId = 5
ORDER BY c.timeStamp DESC
Run Code Online (Sandbox Code Playgroud)

正如人们所预料的那样,随着集合和单个分区的大小增加,这种方法导致RU/s消耗增加并且性能降低.作为此问题的临时补救措施,我添加了额外的where子句以按时间戳限制查询范围:

SELECT TOP 1 *
FROM c
WHERE c.deviceId = 5
 AND c.timeStamp >= 1506608558 --timestamps are unix/epoch based to optimize indexing
 AND c.timeStamp <= 1506694958
ORDER BY c.timeStamp DESC
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来按分区ID选择最新文档,因为添加此where子句可能会导致意外或缺少结果.

Mr *_*lim 2

我遇到过类似的场景,其中我正在跟踪的资产的 ID 构成了我的分区键,在该分区内,每个资产每天有 2,880 个事件,并且随着时间的推移,该数字将继续增长。

虽然其他用例需要完整的事件历史记录,但此特定用例需要提取最新事件。因此,创建了一个备用集合,它使用相同的分区键,但包含当前状态,即该资产的最新事件。

当事件写入写入端(保留资产的所有事件的集合)时,触发器会使用最新值更新读取端。

虽然这看起来会使写入工作量增加一倍,但在我们的用例中,读取端的性能提高弥补了这一点。

我发现这篇 MS 文章很有用 使用Azure Cosmos DB 中的更改源支持