【发布时间】: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
}
我可以这样做:
- 获取 id 为 12345 的所有文档
- 如果文档数 >=5,则获取最后一个文档(实例为 5)并将其删除。
- 插入新文档
但是,插入单个文档需要运行 3 个查询。
有没有更优雅的方法来做到这一点?
谢谢!
【问题讨论】:
-
您是对的,您必须维护自己的要删除的项目列表。您可以在存储过程中执行此操作(因为 sp 是分区范围的),但您仍然需要多个操作 + 每个操作的相关 RU 成本。也就是说:我不明白需要限制分区中的项目数量。另外,我假设您指的是 logical 分区,对吗? (因为不借助大量数据或人为增加 RU/sec 就无法控制物理分区)。请编辑您的问题以包含更多详细信息。
-
感谢您的回复!通过限制分区中的项目数量,我的意思是对于特定的 id,我只想维护 6 个项目以最小化存储的数据量。是的,在这种情况下,我指的是逻辑分区 (/id)。有没有办法以某种方式利用 TTL?
-
假设这只是一个限制增长的清理问题,似乎是使用 Azure Function 运行的定期维护作业,否则将是最简单的并且避免影响写入。
-
我的回答对你有用吗?
-
您的问题解决了吗?
标签: azure-cosmosdb