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