Jawabannya tergantung pada driver yang Anda gunakan. Semua driver MongoDB yang saya tahu memiliki cursor.forEach()
diimplementasikan dengan satu atau lain cara.
Berikut beberapa contohnya:
node-mongodb-asli
collection.find(query).forEach(function(doc) {
// handle
}, function(err) {
// done or error
});
mongojs
db.collection.find(query).forEach(function(err, doc) {
// handle
});
bhikkhu
collection.find(query, { stream: true })
.each(function(doc){
// handle doc
})
.error(function(err){
// handle error
})
.success(function(){
// final callback
});
luwak
collection.find(query).stream()
.on('data', function(doc){
// handle doc
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// final callback
});
Memperbarui dokumen di dalam .forEach
panggilan balik
Satu-satunya masalah dengan memperbarui dokumen di dalam .forEach
panggilan balik adalah bahwa Anda tidak tahu kapan semua dokumen diperbarui.
Untuk mengatasi masalah ini, Anda harus menggunakan beberapa solusi aliran kontrol asinkron. Berikut beberapa opsinya:
- tidak sinkron
- janji (ketika.js, bluebird)
Berikut adalah contoh penggunaan async
, menggunakan queue
fitur:
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();
}
}