2010-06-21 75 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(); 
     } 
    }