MongoDB在节点js上过期事件
问题描述:
我想用mongoose模型捕获node.js上的mongodb收集过期事件。 例如,如果我有这个集合MongoDB在节点js上过期事件
var mySchema = mongoose.Schema({
name: String,
time: {
type: Date,
default: Date.now,
expires: 60*60,
}
})
当文档创建,将在1小时后删除。当这个文件被删除时,我想调用节点js函数。例如,我有这个功能
function log(name) {
console.log('document with name ' + name + ' was successfully removed');
}
而我想调用这个函数为每个文件,当他们被删除。
谢谢。
答
正如我在评论中提到的,MongoDB没有任何内置的通知功能。你可以通过跟踪MongoDBs oplog
来实现Meteor使用的相同方法,但是这需要很多的工作。
唯一相当简单和合理的解决方案是通过使用像node-schedule(npm install node-schedule --save
)这样的应用程序级别而不是数据库级别。
下面是一个例子:
var schedule = require('node-schedule');
var Model = mongoose.model('Model', mySchema);
Model.create({ name: 'Michael' }, function(err, doc) {
if (err) return console.error(err); // Handle the error
var now = new Date();
var when = new Date(now).setHours(now.getHours() + 1);
schedule.scheduleJob(when, function() {
// This callback will fire in one hour
});
});
的问题与此是回调将会触发即使MongoDB的崩溃或相似,并且无法删除该文件。另一个问题是,如果你的应用程序崩溃,你的日程安排回调丢失。
不幸的是,这对于MongoDB来说是不可能的。 MongoDB没有任何内置的通知功能。然而,你可以通过拖拽oplog来实现Meteor使用的相同方法,但即使如此,这也是一个非常棘手的情况。我会用解决方法写一个答案。 – Svenskunganka