Câu trả lời phụ thuộc vào trình điều khiển bạn đang sử dụng. Tất cả các trình điều khiển MongoDB mà tôi biết đều có cursor.forEach()
được thực hiện theo cách này hay cách khác.
Dưới đây là một số ví dụ:
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
});
nhà sư
collection.find(query, { stream: true })
.each(function(doc){
// handle doc
})
.error(function(err){
// handle error
})
.success(function(){
// final callback
});
cầy mangut
collection.find(query).stream()
.on('data', function(doc){
// handle doc
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// final callback
});
Cập nhật tài liệu bên trong .forEach
gọi lại
Sự cố duy nhất khi cập nhật tài liệu bên trong .forEach
gọi lại là bạn không biết khi nào tất cả các tài liệu được cập nhật.
Để giải quyết vấn đề này, bạn nên sử dụng một số giải pháp dòng điều khiển không đồng bộ. Dưới đây là một số tùy chọn:
- không đồng bộ
- lời hứa (when.js, bluebird)
Đây là một ví dụ về việc sử dụng async
, sử dụng queue
của nó tính năng:
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();
}
}