[英]Mongodb Tailable Cursor in nodejs, how to stop stream
我使用下面的代碼從mongodb capped集合中獲取數據
函數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);
});
這非常有效,因為我能夠看到插入db中的任何新文檔。
我可以在mongod -verbose中看到,在每個200ms之后有查詢運行查詢{$ gt:latest_id},這很好,但我不知道如何關閉此查詢:(我在nodejs和使用中非常新第一次mongodb tailable選項,我完全迷失了,任何幫助或線索都非常感謝
什么是從返回.stream()
從方法光標對象從返回.find()
是所述的一種實現節點變換流接口。 具體來說,這是一個“可讀”的流。
因此,只要在要讀取的流中接收到新數據並且可用,就會發出“數據”事件。
還有其他方法,如.pause()
和.resume()
,可用於控制這些事件的流程。 通常,您將這些“內部”稱為“數據”事件回調,您希望確保在處理“下一個”數據事件之前執行該回調中的代碼:
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()
進行轉換。 節點流是非常有用和強大的東西,在與它們的使用達成協議時非常值得。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.