2013-03-06 18 views
1

对于日志查看器,我必须将更新写入sockJS套接字的mongoDB集合中。mongoDB + nodeJS:无法保持流游标打开

基于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})); 
}); 

我在做什么错?这可以工作吗?

回答

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})); 
}); 
+0

我想你还想包括'awaitdata:true'选项。 – JohnnyHK 2013-03-06 22:25:43

+0

是的,我忘了。 – WiredPrairie 2013-03-07 01:07:52

+0

非常感谢。 我试过了,并做了这个改变,并且把集合的创建改为了'db.logs = database.collection('logs',{'capped':true,'size':10000});'。我之前已经弃置了旧的收藏品,开始整理。 但是,我得到一个错误告诉我,我只能创建一个加盖集合的可拖动游标。我需要做更多的事情才能使我的收藏达到上限吗? – 2013-03-07 08:31:09