问题描述
我们使用的是 AWS DocumentDB v3.6.0。
我们想使用 MongoDB TTL 索引功能在一段时间后删除项目。项目经常更新,直到发生特殊事件。因此,我们需要经常更新 ttl
字段。
db.test.insertOne({_id: "12345",ttl: new Date()})
db.test.createIndex({ttl:-1},{expireAfterSeconds: 3600})
db.stats()
产生以下预期结果:
[
{
"avgobjSize": 51,"capped": false,"count": 1,"indexSizes": {
"_id_": 16384,"ttl_-1": 16384
},"nindexes": 2,"ns": "db.test","ok": 1,"size": 51,"storageSize": 16384,"totalIndexSize": 32768
}
]
但是,如果我们更新项目的 ttl 时间戳,ttl_-1
索引会不断增长。
for (let i = 1; i < 1000; i++) {
db.test.updateOne({ _id: "12345" },{ $set: { ttl: new Date() } });
}
db.stats()
现在产生:
[
{
"avgobjSize": 51,"ttl_-1": 90112
},"storageSize": 65536,"totalIndexSize": 106496
}
]
如您所见,ttl_-1
索引大于 _id_
索引,即使我们仍然只有一项。为什么?
解决方法
就地数据覆盖有各种问题。例如,如果您执行此类写入并断电,不仅新数据会丢失,而且您最终还会破坏数据库中已有的数据。
因此,任何写入都会分配新的存储空间也就不足为奇了。
1000 次写入(90 KB 数据?)不足以得出索引正在无限增长的结论。尝试一百万,或者无论需要多少才能获得上述索引,例如 64 MB。
,您是否尝试删除并重新创建索引?在您的示例中, _id_ 索引仅插入(从未更新)并且不会经历 ttl_-1 索引所做的流失。在您的简单示例以及全尺寸 DocumentDB 数据库中查看之前和之后会很有趣。