2010-06-21 69 views
27

對於某些項目工作,我使用Node.js,我想監視Mongo數據庫(集合)的更改,如果添加了某些內容,則基本上會觸發事件。使用Node.js監視Mongo的更改

任何人都知道這是可能的嗎?我正在使用node-mongodb-native驅動程序。

如果不是這樣,我還想要將任何可用的指針從服務器(從node運行)推送到客戶端瀏覽器。

回答

3

問題是如果所有數據都通過您的node.js應用程序添加到您的數據庫。如果是這樣,您可以使用EventEmitter類的node.js來觸發事件(http://nodejs.org/api.html#eventemitter-14)。

如果數據庫被其他應用程序填充,事情變得越來越困難。在這種情況下,您需要類似於數據庫觸發器,這是MongoDB中尚未提供的AFAIK。

一旦HTML 5 websockets API進入所有主流瀏覽器,就可能將事件推送到客戶端(又名Comet)。與此同時,您只能嘗試使用像(長期)AJAX輪詢,永久框架等技術來模擬此行爲,但它們每個都有其弱點。

+1

如果它是一個其他的同步應用程序,並在增加,你可以使用一個消息隊列通知你的node.js應用程序。這將全部在服務器端。 – igorw 2010-07-14 15:05:02

3

我會在你的mongodb中打開復制。有重複嗎?包含一系列更改的數據庫,類似於mysql複製日誌。你可以監視它。

-daniel

0

collection.insert({ 「鍵1」:VAL1, 「KEY2」: 「值2」},功能(ERR,資訊){
如果(ERR){// 處理這個 } 其他{ 如果(信息){

你調用一個fireandforgetfunction(信息);這裏 可以寫入日誌或發送到SQS或做一些其他的孩子產卵或過程的東西這甚至是一個回調但是我認爲在大多數情況下,火災和遺忘可能會發生。 我說火和忘記,因爲我知道esume你不需要持有 的響應,所以你可以返回你需要的任何東西給客戶端。 而在部分回答您的其他問題,您可以自上次回答這樣

  db.close(); 
     var myJSON =[];        
     sys.puts("Cool info stored and did a non blocking fire and forget for some other mongo monitoring stuff/process and sending control back to the browser"); 
     sys.puts(sys.inspect(info));//remove later 
     myJSON.push({"status":"success"});      
     myJSON.push({"key1":val1,"key2":val2});//or whatev you want to send 
     res.writeHead(200, { "Content-Type" : "text/plain" }); 
     res.write(JSON.stringify(myJSON)); 
     res.end(); 
     } 
    }