2015-11-05 89 views
0

我想用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

回答

1

正如我在評論中提到的,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的崩潰或相似,並且無法刪除該文件。另一個問題是,如果你的應用程序崩潰,你的日程安排回調丟失。