首页 文章

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

提问于
浏览
5

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

SELECT TOP 1 *
FROM c
WHERE c.deviceId = 5
ORDER BY c.timeStamp DESC

正如人们所预料的那样,随着集合和单个分区的大小增加,这种方法导致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

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

1 回答

  • 1

    我有一个类似的情况,我跟踪的资产的ID形成我的分区密钥,并且在该分区内每个资产每天有2,880个事件,并且这将随着时间的推移而继续增长 .

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

    当事件写入WRITE侧时,作为保留资产的所有事件的集合,触发器将使用最新值更新READ端 .

    虽然这似乎可以使写入工作倍增,但在我们的用例中,读取端的性能提升弥补了这一点 .

    我发现这篇MS文章有用Working with the change feed support in Azure Cosmos DB

相关问题