2014-07-16 3 views
0

travaille sur les notifications push en utilisant mongodb et nodejs. Je peux voir les nouvelles notifications ajoutées (qui sont addede dans MongoDB) dans mon navigateur Mais, si je mis à jour le dossier, la valeur est mise à jour dans le navigateurobtenir la dernière mise à jour mongo id de nodejs

// if no error get reference to colelction named: 'notifications' 
    db.collection('notifications', function(err, collection){ 
     if(err) { 
      throw err; 
     } 

     // if no error apply a find() and get reference to doc 
     collection.find().sort({ 
      $natural: -1 
     }).limit(1).nextObject(function(err, doc) { 
      // Rewind the cursor, resetting it to point to the start of the query 
      if(err) { 
       throw err; 
      } 
      // using tailable cursor get reference to our very first doc 
      var query = { 
       _id: { 
        $gt: doc._id 
       } 
      }; 
      var options = { 
       tailable: true, 
       awaitdata: true, 
       numberOfRetries: -1 
      }; 
      var cursor = collection.find(query, options).sort({ 
       $natural: 1 
      }); 

      // This function will take cursor to next doc from current as soon as 'notifications' database is updated 
      function next() { 
       cursor.nextObject(function(err, message) { 
        if (err) throw err; 
        console.log(message.message); 
        mdsok.volatile.emit('notification', message); 
        next(); 
       }); 
      } 
      // what you need to do is: call it first time 
      next(); 
     }); 

C'est ce que je fais dans mon code.

que dois-je faire pour mettre à jour la valeur dans le navigateur lorsque je mets à jour la même chose en db.

S'il vous plaît aidez-moi. Merci d'avance!

+1

Il s'agit d'une implémentation de curseur disponible sur ce qui doit être une collection plafonnée. Vous ne devriez vraiment pas mettre à jour sur une collection plafonnée. Pour un, puisqu'il est "plafonné" le document peut ne pas exister. Pour deux, "grandir" un document de collection plafonné n'est pas autorisé. Ils sont destinés à agir comme une "file d'attente", donc "insérer seulement". –

+0

Mon besoin actuel est, j'affiche certaines valeurs dans le navigateur qui sont récupérées à partir de la base de données Mongodb. Si cette valeur a changé dans db, alors sans actualiser ma page, j'ai besoin d'afficher la valeur mise à jour sur le navigateur en utilisant les sockets. Quelqu'un peut-il me donner un bon exemple pour ce genre d'exigence. – GGGGG

+0

@NeilLunn, ce que vous avez dit est absolument juste! Nous ne pouvons pas mettre à jour la collection plafonnée. Laissez sur la collection plafonnée. Maintenant, je n'utilise pas la collection plafonnée. J'utilise une collection normale et j'ai inséré quelques valeurs dans la collection. Maintenant, je dois déclencher l'objet mis à jour chaque fois que je mets à jour l'objet dans la base de données. – GGGGG

Répondre

0

Mon problème a été résolu dans une certaine mesure.

var http = require('http'), 
fs = require('fs'), 
// NEVER use a Sync function except at start-up! 
index = fs.readFileSync('index.html'); 

// Send index.html to all requests 
var app = http.createServer(function(req, res) { 
    res.writeHead(200, { 
     'Content-Type': 'text/html' 
    }); 
    res.end(index); 
}); 

// Socket.io server listens to our app 
var io = require('socket.io').listen(app); 
var MongoClient = require('mongodb').MongoClient; 

function getdata(){ 
    MongoClient.connect("mongodb://127.0.0.1:27017/test", function(err, db) { 
     var collection = db.collection('my_collection'); 

     var stream = collection.find({ 
      //'_id': new ObjectID('53eb6f2e75fd7ad00d000029') 
      //_id: ObjectID.createFromHexString("53eb6f2e75fd7ad00d000029") 
      }).stream(); 
     stream.on("data", function(item) { 
      io.sockets.emit('db_status', { 
       status: item.status 
      }); 
      prev = item.status; 
      console.log(prev); 
     }); 
     stream.on("end", function() { 
      console.log("Done loading data"); 
     }); 
    }); 
} 


// Send current time every 5 secs 
setInterval(getdata, 5000); 

// Emit welcome message on connection 
io.sockets.on('connection', function(socket) { 

    socket.emit('welcome', { 
     message: 'Welcome!' 
    });    

    socket.on('i am client',function(data){ 
     console.log(data); 
    }); 
}); 


app.listen(3000); 

pour 5 secondes, je frappais la db et obtenir la valeur et l'afficher dans le navigateur.

Pour obtenir l'objet nouvellement inséré, nous utilisons .nextObject() dans node.js

Est-il possible d'obtenir l'objet de la mise à jour db comme ci-dessus dans node.js.

Questions connexes