使用 oplog 观看 mongo 更新事件

kes*_*hav 1 mongoose mongodb

我必须监听 mongodb 文档中特定字段的变化并将数据相应地发送给客户端

我尝试寻找解决方案,但我唯一能找到的就是查询mongodb的oplogs(操作日志)。

db.collection("oplog.rs", function(err, oplog) {})
Run Code Online (Sandbox Code Playgroud)

问题

我们实际上将如何根据 oplog(上限集合)做出决策,以及我们将多久查询一次 oplog 以查看更改?

我们是否有使用 mongoose 来解决这个问题的其他解决方案?

inv*_*ess 5

MongoDB 在一个名为“oplogs”(操作日志)的集合中跟踪所有数据库更改。当您需要跟踪数据库的每个集合时,可以使用 Oplog。但是,如果您只需要跟踪一个集合,则可以使用以下代码在该特定集合上创建可跟踪游标。(注意:只有上限集合才能有可尾游标)

但是,如果您想使用 oplog,在多个 MongoDB 服务器实例的情况下,默认情况下会启用 oplog,但如果您在单实例 MongoDB 服务器上工作,则需要在命令提示符中通过以下命令在 mongoDB 中启用 oplog:

mongod --replSet rs0
Run Code Online (Sandbox Code Playgroud)

然后要使用 Mongoose 从 oplogs 集合中获取记录,您可以尝试以下代码。

var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/local');  //local db has oplogs collection

mongoose.connection.on('open', function callback() {
    var collection = mongoose.connection.db.collection('oplog.rs'); //or any capped collection
    var stream = collection.find({}, {
        tailable: true,
        awaitdata: true,
        numberOfRetries: Number.MAX_VALUE
    }).stream(); 

stream.on('data', function(val) {
    console.log('Doc: %j',val);
});

stream.on('error', function(val) {
    console.log('Error: %j', val);
});

stream.on('end', function(){
    console.log('End of stream');
});
});
Run Code Online (Sandbox Code Playgroud)

现在我想这可能会有所帮助。上面的代码是如何在 Mongoose 中实现可尾游标的。