views:

389

answers:

3

I'm using Node.js for some project work and I would like to monitor my Mongo database (collection) for changes, basically fire an event if something gets added.

Anyone know if this is possible? I'm using the node-mongodb-native drivers.

If it's not I'd also like any available pointers on pushing data from the server (run with node) to the client browser.

A: 

The question is if all data is added to your database through your node.js app. If so, you can use the EventEmitter class of node.js to trigger an event (http://nodejs.org/api.html#eventemitter-14).

If the database is populated by some other app, things are getting difficult. In this case you would need something like a database trigger, which is AFAIK not yet availabled in MongoDB.

Pushing Events to the Client (aka Comet) will be possible once the HTML 5 websockets API makes its way into all major browsers.

In the meantime, you can only try to emulate this behaviour using techniques like (long-term) AJAX polling, forever frame etc. but each of them has its weaknesses.

Franz
If it's an other synchronous app that does the adding, you could use a message queue to notify your node.js app. This would all be on the server side.
igorw
+1  A: 

I would turn on replication in your mongodb. There is a replicate? database that contains a list of changes, similar to the mysql replication log. You can monitor that.

-daniel

Daniel
A: 

collection.insert({"key1":val1,"key2":"val2"}, function(err, info){
if(err){ //handle this } else{ if(info){

you call a fireandforgetfunction(info); here that can write to logs or send to SQS or do some other child spawn or in process thing. This could even be a callback but I think a fire and forget may do in most circumstances. I say fire and forget because I presume you don't need to hold up the response so you can return what ever you need to the client. And in part-answer to your other question you can return JSON like this

         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();
        }
    }
dryprogrammers