mongoDB + nodeJS:无法保持流游标打开

时间:2013-03-06 20:13:27

标签: node.js mongodb sockjs

对于日志查看器,我必须在sockJS套接字上的mongoDB集合中编写更新。

基于this post,我正在使用本机nodeJS驱动程序的流游标来执行此操作,但它仅适用于创建流时集合中存在的内容。没有进一步的更新。

这是我的代码:

var server = new mongodb.Server(config.db_host, config.db_port, {});
var DB = new mongodb.Db('myLogs', server, {w:0}).open(function (error, database) {
    if (error) throw error;
    db.logs = database.collection('logs');
});

var stream = db.logs.find({user: sID}, {sort: [['_id', 'asc']]}).stream();

stream.on('error', function (err) {
    socket.write(JSON.stringify({'action': 'log','param': 'log db streaming error'}));
});
stream.on('data', function (doc) {
    socket.write(JSON.stringify({'action': 'log','param': doc.log}));
});

我做错了什么?这可以吗?

1 个答案:

答案 0 :(得分:3)

如果你有一个上限集合,你可以使用TailableCursor,它可以做你想要的。标准CursorStream仅返回在调用find时匹配的结果(如您所见)。

尽管如此,在Node.JS中没有丰富的信息。 Here指向正确的方向。

虽然我没有测试过这段代码,但它应该如下所示。关键是使用上限集合并将tailableawaitdata选项设置为true

var stream = db.logs.find({user: sID}, {
    tailable: true,
    awaitdata: true 
    /* other options */
}).stream();

stream.on('data', function (doc) {
    socket.write(JSON.stringify({'action': 'log','param': doc.log}));
});