答えは、使用しているドライバーによって異なります。私が知っているすべてのMongoDBドライバーにはcursor.forEach()
があります 何らかの方法で実装されました。
次にいくつかの例を示します。
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
});
僧侶
collection.find(query, { stream: true })
.each(function(doc){
// handle doc
})
.error(function(err){
// handle error
})
.success(function(){
// final callback
});
マングース
collection.find(query).stream()
.on('data', function(doc){
// handle doc
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// final callback
});
.forEach
内のドキュメントを更新しています コールバック
.forEach
内のドキュメントを更新する際の唯一の問題 コールバックは、すべてのドキュメントがいつ更新されるかわからないということです。
この問題を解決するには、非同期制御フローソリューションを使用する必要があります。いくつかのオプションがあります:
- 非同期
- 約束(when.js、bluebird)
async
の使用例を次に示します。 、queue
を使用 機能:
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();
}
}