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'); 
} 

而我想调用这个函数为每个文件,当他们被删除。

谢谢。

+0

不幸的是,这对于MongoDB来说是不可能的。 MongoDB没有任何内置的通知功能。然而,你可以通过拖拽oplog来实现Meteor使用的相同方法,但即使如此,这也是一个非常棘手的情况。我会用解决方法写一个答案。 – Svenskunganka

正如我在评论中提到的,MongoDB没有任何内置的通知功能。你可以通过跟踪MongoDBs oplog来实现Meteor使用的相同方法,但是这需要很多的工作。

唯一相当简单和合理的解决方案是通过使用像node-schedulenpm 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的崩溃或相似,并且无法删除该文件。另一个问题是,如果你的应用程序崩溃,你的日程安排回调丢失。