Azure cosmosdb 限制cosmosdb分区中的文档数

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

我有一个cosmosdb集合,每个分区包含一组文档。我希望维护集合,使逻辑分区(本例中为“id”)不超过5个文档的限制。在下面的示例中,当添加第六个条目(例如2020年11月8日)时,我希望删除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
}
我可以这样做:

  • 获取id为12345的所有文档
  • 如果文档数>=5,则获取最后一个文档(实例为5)并将其删除
  • 插入新文件
  • 但是,这是一个运行3个查询以插入单个文档的过程

    有没有更优雅的方法


    谢谢

    您可以使用
    OFFSET 1 LIMIT 5
    获取5个最新条目。有关更多详细信息,您可以阅读有关的官方文档

    您可以获取数据的计数(假设为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));
    

    您可以使用
    OFFSET 1 LIMIT 5
    获取5个最新条目。有关更多详细信息,您可以阅读有关的官方文档

    您可以获取数据的计数(假设为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));
    

    你是对的,因为你必须维护你自己要删除的项目列表。您可以在存储过程中执行此操作(因为sp是分区范围的),但您仍然会有多个操作以及每个操作的相关RU成本。也就是说:我不理解限制分区中项目数量的必要性。另外,我假设您指的是逻辑分区,对吗?(因为如果不使用大量数据或人为增加RU/sec,就无法控制物理分区)。请编辑您的问题以包含更多详细信息。感谢您的回复!通过限制分区中的项目数量,我的意思是对于一个特定的id,我只想维护6个项目来最小化存储的数据量。是的,在本例中我指的是逻辑分区(/id)。有什么方法可以利用TTL吗?假设这只是一个清理问题来限制增长,似乎使用Azure函数或其他方法运行定期维护作业是最简单的,可以避免影响写入。我的答案对你有用吗?你的问题解决了吗?你是对的,在这种情况下,您必须维护自己要删除的项目列表。您可以在存储过程中执行此操作(因为sp是分区范围的),但您仍然会有多个操作以及每个操作的相关RU成本。也就是说:我不理解限制分区中项目数量的必要性。另外,我假设您指的是逻辑分区,对吗?(因为如果不使用大量数据或人为增加RU/sec,就无法控制物理分区)。请编辑您的问题以包含更多详细信息。感谢您的回复!通过限制分区中的项目数量,我的意思是对于一个特定的id,我只想维护6个项目来最小化存储的数据量。是的,在本例中我指的是逻辑分区(/id)。有什么方法可以利用TTL吗?假设这只是一个清理的问题来限制增长,似乎使用Azure函数或其他方式运行定期维护作业是最简单的,可以避免影响写入。我的答案对你有用吗?你的问题解决了吗?谢谢Jason!问题在于首先要确保只保存5个条目,并且与检索它们无关。我可以执行foreach并设置ttl,但这意味着我需要对db执行多个查询。我现在正在考虑从数据库中读取文档,在内存中更新它,只保留最后5个条目,然后写回数据库。谢谢Jason!问题在于首先要确保只保存5个条目,并且与检索它们无关。我可以执行foreach并设置ttl,但这意味着我需要对db执行多个查询。我现在正在考虑从数据库中读取文档,在内存中更新它,只保留最后5个条目,然后写回数据库。