我正在考虑在特定时间删除文件。
const TestSchema = new Schema({
expire_at: {
type: Date,
},
}, {
timestamps: true,
});
TestSchema.index({expire_at: 1}, {expireAfterSeconds: 0});
POST
const test = new TestSchema(this.request.body);
test.expire_at = test.end_time;
try {
yield test.save();
} catch (error) {
this.status = 409;
this.response.body = error.errors;
return;
}
this.response.body = test;
this.status = 201;
似乎文件在expire_at中指定的时间删除。
我正在使用此日期格式:2016-07-20T05:01:19.567Z
答案 0 :(得分:14)
这将在两小时内删除文档:
const TestSchema = new Schema({
expire_at: {type: Date, default: Date.now, expires: 7200}
})
//expired in 2 hours
答案 1 :(得分:7)
要在特定时间删除MongoDB文档,您可以使用 TTL(生存时间)。 TTL 索引是MongoDB可以用来在一定时间后自动从集合中删除文档的特殊单字段索引。
所以你需要创建一个TTL索引,如:(mongo shell命令)
db.yourCollecName.createIndex({"expire_at": 1 }, { expireAfterSeconds: 5 } );
或者您可以使用mongoose来创建此索引
TestSchema.createIndex({"expire_at": 1 }, { expireAfterSeconds: 5 } );
然后每隔60秒检查一次mongodb,如果expire_at
日期时间小于当前日期时间,则此记录将在5秒后删除。
TTL索引不保证将删除过期数据 到期后立即。时间a之间可能会有延迟 文档过期以及MongoDB从中删除文档的时间 数据库。
删除过期文档的后台任务每60个运行一次 秒。因此,文档可能会在期间保留在集合中 文件到期和运行之间的时间段 后台任务。
<强> TTL Indexes 强>
注意:使用createIndex
代替index
答案 2 :(得分:3)
删除过程在60秒后运行。 因此,在删除时间过后,文档可以存在59秒。
答案 3 :(得分:2)
正如Amit所说,TTL索引不能保证在到期时删除数据;过期数据的后台任务将每60秒运行一次。
后台任务也可能受到性能争用和工作负载的影响,这可能导致数据远远超出此窗口:
删除过期文档的后台任务每60个运行一次 秒。因此,文档可能会在期间保留在集合中 文件到期和运行之间的时间段 后台任务。
因为删除操作的持续时间取决于工作负载 你的mongod实例,过期数据可能存在超过一段时间 背景任务运行之间的60秒时间。
答案 4 :(得分:0)
const otpSchema = new mongoose.Schema({
// other fields
// expiry date of the document
expire_at: {
type: Date,
default: Date.now(),
expires: 60
}
}, { timestamps: true })
otpSchema.index({ "expire_at": 1 }, { expireAfterSeconds: 5 });
这件事在我使用猫鼬时对我有用。只需添加一个标题为“expire_at”的额外字段并将索引添加到架构中。剩下的一切都由mongodb自己管理。