【问题标题】:Limit number of documents in a partition for cosmosdb限制 cosmosdb 分区中的文档数
【发布时间】:2020-08-11 01:31:56
【问题描述】:

我有一个 cosmosdb 集合,每个分区都包含一组文档。我想维护该集合,以使逻辑分区(在本例中为“id”)不会超过 5 个文档的限制。在下面的示例中,当添加第六个条目(例如 2020 年 8 月 11 日)时,我想删除 2020 年 7 月 13 日创建的文档,因为它是最早更新的。 基本上,我想确定 id 为 12345 的项目,只有 5 个最新条目,没有更多。这是为了减少数据库中的数据,从而避免查询比需要更多的数据。

{
"id": 12345,
"lastUpdated":  8/10/2020
},
{
"id": 12345,
"lastUpdated":  8/3/2020
},
{
"id": 12345,
"lastUpdated":  7/27/2020
},
{
"id": 12345,
"lastUpdated":  7/20/2020
},
{
"id": 12345,
"lastUpdated":  7/13/2020
}

我可以这样做:

  1. 获取 id 为 12345 的所有文档
  2. 如果文档数 >=5,则获取最后一个文档(实例为 5)并将其删除。
  3. 插入新文档

但是,插入单个文档需要运行 3 个查询。

有没有更优雅的方法来做到这一点?

谢谢!

【问题讨论】:

  • 您是对的,您必须维护自己的要删除的项目列表。您可以在存储过程中执行此操作(因为 sp 是分区范围的),但您仍然需要多个操作 + 每个操作的相关 RU 成本。也就是说:我不明白需要限制分区中的项目数量。另外,我假设您指的是 logical 分区,对吗? (因为不借助大量数据或人为增加 RU/sec 就无法控制物理分区)。请编辑您的问题以包含更多详细信息。
  • 感谢您的回复!通过限制分区中的项目数量,我的意思是对于特定的 id,我只想维护 6 个项目以最小化存储的数据量。是的,在这种情况下,我指的是逻辑分区 (/id)。有没有办法以某种方式利用 TTL?
  • 假设这只是一个限制增长的清理问题,似乎是使用 Azure Function 运行的定期维护作业,否则将是最简单的并且避免影响写入。
  • 我的回答对你有用吗?
  • 您的问题解决了吗?

标签: azure-cosmosdb


【解决方案1】:

您可以使用OFFSET 1 LIMIT 5 获取 5 个最新条目。更多详情可以阅读OFFSET LIMIT clause in Azure Cosmos DB的官方文档。

您可以获取数据的计数(假设为100)并设置ttl,或直接删除。我们可以像下面这样查询。

SELECT f.id, f.lastUpdated FROM yourcosmosdb f ORDER BY f.lastUpdated OFFSET 6 LIMIT 100

Foreach

List<Task> concurrentDeleteTasks = new List<Task>();
while (feedIterator.HasMoreResults)
{
    FeedResponse<response> res = await feedIterator.ReadNextAsync();
    foreach (var item in res)
    {                        
        concurrentDeleteTasks.Add(container.DeleteItemAsync<response>(item.id, new PartitionKey(item.deviceid)));
    }
}
await Task.WhenAll(concurrentDeleteTasks.Take(3));

您也可以foreach集合并设置ttl=10,这些数据将在10s后被删除。

可以获得最新的5条数据:

SELECT f.id, f.lastUpdated FROM yourcosmosdb f ORDER BY f.lastUpdated OFFSET 1 LIMIT 5

【讨论】:

  • 谢谢杰森!问题在于首先要确保只保存 5 个条目,并且与检索它们无关。我可以做一个 foreach 并设置 ttl,但这意味着我需要对数据库执行多个查询。我现在正在考虑从数据库中读取文档,在内存中更新它以仅保留最后 5 个条目,然后写回数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2017-08-12
相关资源
最近更新 更多