【问题标题】:Cosmos DB (DocumentDB API): Efficient way to query most recent document by partition ID?Cosmos DB(DocumentDB API):按分区 ID 查询最新文档的有效方法?
【发布时间】:2017-09-29 14:57:03
【问题描述】:

我有一个 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 子句可能会导致意外或丢失结果。

【问题讨论】:

    标签: azure-cosmosdb


    【解决方案1】:

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

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

    当一个事件被写入 WRITE 端时,作为保存资产所有事件的集合,触发器会使用最新值更新 READ 端。

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

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

    【讨论】:

    • 谢谢@Mr Slim,我最终可能会走这条路,但我希望有一种替代方法可以提供最新的阅读,而无需维护这个有状态的附加集合。
    • 祝你好运。如果您找到替代方法,请在此处发布,因为我希望看到替代方法。
    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    相关资源
    最近更新 更多