事务内动态创建 TTL 索引实现延迟删除队列
结合 MongoDB 4.0 多文档事务与 TTL 索引,设计一个安全的延迟删除机制 · 难度:入门 · +10XP
事务内动态创建 TTL 索引实现延迟删除队列
TTL 索引通常用于过期数据自动清理,但很少与事务结合。本教程带你实现在一个事务中:当用户取消订单时,写入一条‘延迟删除记录’到专用集合,同时动态创建带有 expireAfterSeconds 的索引,让 MongoDB 在指定时间后自动物理删除该记录。利用事务保证‘写入记录 + 创建索引’的原子性,避免垃圾数据存留。此模式适合软删除后需延迟物理清除的场景。
const session = client.startSession();
session.startTransaction();
try {
const deleteQueue = db.collection('delete_queue');
await deleteQueue.insertOne({ orderId: 123, createAt: new Date() }, { session });
await deleteQueue.createIndex({ createAt: 1 }, {
expireAfterSeconds: 3600,
session
});
await session.commitTransaction();
} catch (err) {
await session.abortTransaction();
}