在nodejs中Mongodb Tailable Cursor,如何停止流

时间:2014-11-12 08:03:45

标签: javascript node.js mongodb mongodb-query

我使用下面的代码从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选项而且完全迷失了,任何帮助或线索都非常感激

1 个答案:

答案 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()进行转换。节点流是非常有用和强大的东西,在与它们的使用达成协议时非常值得。