Mongoose でバッチ保存を管理するにはどうすればよいですか? まだできないかもしれないと私は見ました:
のようないくつかのフロー制御ライブラリを使用することについて言及されていますが、マングースにも約束q
があることに気付きました。使用できますか? jQuery Deferred/Promises のようにできますか
$.when(obj1.save(), obj2.save(), obj3.save()).then ->
# do something?
mongoose では、Promise の実装を選択できるようになりました。
ここでは、nodejs に組み込まれた node.js のデフォルト システム Promise (ES6) を使用しています。
var mongoose = require('mongoose');
mongoose.Promise = global.Promise; // use system implementation
Promise.all(obj1.save(), obj2.save(), obj3.save())
.then(function(resultSaves) {
console.log('parallel promise save result :');
console.log(resultSaves);
mongoose.disconnect();
}).catch(function(err) {
console.log('ERROR on promise save :');
console.log(err);
mongoose.disconnect();
});
ノード -- バージョン v4.1.1
マングース@4.1.8
var functions = [];
for (var i=0; i < docs.length; i++) {
functions.push((function(doc) {
return function(callback) {
doc.save(callback);
};
})(docs[i]));
}
async.parallel(functions, function(err, results) {
console.log(err);
console.log(results);
});
複数のマングースドキュメントを並行して保存するには、次のような簡単な操作を実行できます(docs
保存するドキュメントの名前が付いた配列があると仮定します)。
var count = docs.length;
docs.forEach(function(doc) {
doc.save(function(err, result) {
if (--count === 0) {
// All done; call containing function's callback
return callback();
}
});
});
非同期並列の使用方法に関する洗練された例は次のとおりです。
async.parallel([obj1.save, obj2.save, obj3.save], callback);
Mongoose の規約は async (err, callback) と同じなので、それらを独自のコールバックでラップする必要はありません。保存呼び出しを配列に追加するだけで、すべてが終了したときにコールバックを取得できます。
async.queueはどうですか。
簡単な例:
var queue = async.queue(function(obj, callback) {
return obj.save(callback);
});
for (var i in objs) {
var obj = objs[i];
// Some changes on object obj
queue.push(obj);
}
キューが空になった後にコールバックが必要な場合:
var emptyQueue = true;
var queue = async.queue(function(obj, callback) {
return obj.save(callback);
});
queue.drain = function() {
// Every callbacks are finished
// bigCallback();
};
for (var i in objs) {
var obj = objs[i];
// Some changes on object obj
queue.push(obj);
emptyQueue = false;
}
if (emptyQueue) {
// Call manually queue drain in case of the queue is empty
// and we need to call bigCallback() for example
return queue.drain();
}