2013-03-06 20 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