sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan kan jeg bruge en cursor.forEach() i MongoDB ved hjælp af Node.js?

Svaret afhænger af den driver du bruger. Alle MongoDB-drivere, jeg kender, har cursor.forEach() implementeret på den ene eller anden måde.

Her er nogle eksempler:

node-mongodb-native

collection.find(query).forEach(function(doc) {
  // handle
}, function(err) {
  // done or error
});

mongojs

db.collection.find(query).forEach(function(err, doc) {
  // handle
});

munk

collection.find(query, { stream: true })
  .each(function(doc){
    // handle doc
  })
  .error(function(err){
    // handle error
  })
  .success(function(){
    // final callback
  });

mangust

collection.find(query).stream()
  .on('data', function(doc){
    // handle doc
  })
  .on('error', function(err){
    // handle error
  })
  .on('end', function(){
    // final callback
  });

Opdatering af dokumenter inde i .forEach tilbagekald

Det eneste problem med at opdatere dokumenter inde i .forEach tilbagekald er, at du ikke aner, hvornår alle dokumenter er opdateret.

For at løse dette problem bør du bruge en asynkron kontrolflowløsning. Her er nogle muligheder:

  • asynkron
  • løfter (when.js, bluebird)

Her er et eksempel på brug af async , ved hjælp af dens queue funktion:

var q = async.queue(function (doc, callback) {
  // code for your update
  collection.update({
    _id: doc._id
  }, {
    $set: {hi: 'there'}
  }, {
    w: 1
  }, callback);
}, Infinity);

var cursor = collection.find(query);
cursor.each(function(err, doc) {
  if (err) throw err;
  if (doc) q.push(doc); // dispatching doc to async.queue
});

q.drain = function() {
  if (cursor.isClosed()) {
    console.log('all items have been processed');
    db.close();
  }
}


  1. Hvordan udfører man en værdibaseret Order By i MongoDB?

  2. Multi-Field Querying på Redis ved hjælp af Redis Spring

  3. MongoDB $ multiplicere

  4. Konvertering af BSON Type ObjectId til JSON (lagring i Mongodb) -Java