8

Mongoose でバッチ保存を管理するにはどうすればよいですか? まだできないかもしれないと私は見ました:

のようないくつかのフロー制御ライブラリを使用することについて言及されていますが、マングースにも約束qがあることに気付きました。使用できますか? jQuery Deferred/Promises のようにできますか

$.when(obj1.save(), obj2.save(), obj3.save()).then ->
    # do something? 
4

8 に答える 8

6

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

于 2015-09-25T03:05:48.150 に答える
3

asyncモジュールの並列機能を試してみてください。

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);
});
于 2012-08-20T06:29:35.057 に答える
2

複数のマングースドキュメントを並行して保存するには、次のような簡単な操作を実行できます(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();
        }
    });
});
于 2012-08-15T15:03:29.583 に答える
1

非同期並列の使用方法に関する洗練された例は次のとおりです。

  async.parallel([obj1.save, obj2.save, obj3.save], callback);

Mongoose の規約は async (err, callback) と同じなので、それらを独自のコールバックでラップする必要はありません。保存呼び出しを配列に追加するだけで、すべてが終了したときにコールバックを取得できます。

于 2013-04-17T19:00:37.453 に答える
-1

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();
}
于 2014-02-22T00:49:18.347 に答える