我使用下面的代码从mongodb capped collection
获取数据函数listen(条件,回调){
db.openConnectionsNew( [req.session.client_config.db] , function(err, conn){
if(err) {console.log({err:err}); return next(err);}
coll = db.opened[db_name].collection('messages');
latestCursor = coll.find(conditions).sort({$natural: -1}).limit(1)
latestCursor.nextObject(function(err, latest) {
if (latest) {
conditions._id = {$gt: latest._id}
}
options = {
tailable: true,
awaitdata: true,
numberOfRetries: -1
}
stream = coll.find(conditions, options).sort({$natural: -1}).stream()
stream.on('data', callback)
});
});
}
然后我使用sockets.broadcast(roomName,'data',document);
在客户端
io.socket.get('/get_messages/', function(resp){
});
io.socket.on('data', function notificationReceivedFromServer ( data ) {
console.log(data);
});
这非常有效,因为我能够看到插入数据库的任何新文档。
我可以在mongod -verbose中看到,每隔200ms就有查询运行查询{$ gt:latest_id},这很好,但我不知道如何关闭此查询:(我很新nodejs和第一次使用mongodb tailable选项而且完全迷失了,任何帮助或线索都非常感激
答案 0 :(得分:3)
从.stream()
返回的Cursor对象的.find()
方法返回的是node transform stream接口的实现。具体来说,这是一个可读的"流。
因此,它的数据"只要收到新数据并在要读取的流中可用,就会发出事件。
还有其他方法,例如.pause()
和.resume()
,可用于控制这些事件的流程。通常你会称这些"内部" a"数据"事件回调,你想确保该回调中的代码在" next"之前执行。处理了数据事件:
stream.on("data", function(data) {
// pause before processing
stream.pause();
// do some work, possibly with a callback
something(function(err,result) {
// Then resume when done
stream.resume();
});
});
但当然这只是一个"范围问题"。所以只要" stream"变量在另一段代码可以访问的范围内定义,然后您可以随时调用任一方法。
同样,通过同样的范围界定,你可以只是"取消定义" "流"对象在代码中的任何一点,进行"事件处理"多余的。
// Just overwrite the object
scope = undefined;
非常值得知道。实际上是较新的版本2.x"节点驱动程序包装了一个"流接口"直接进入标准Cursor
对象,而无需调用.stream()
进行转换。节点流是非常有用和强大的东西,在与它们的使用达成协议时非常值得。