web-dev-qa-db-ja.com

mongooseを使用したMongoDBでの一括挿入

現在、Mongodbに「Collection1」というコレクションがあります。 MongoDBに挿入する必要があるオブジェクトの次の配列があります。 Mongoose APIを使用しています。今のところ、配列を繰り返し処理し、それぞれをmongoに挿入しています。これは今のところ大丈夫ですが、データが大きすぎる場合は問題になります。データを繰り返しなくMongoDBに一括挿入する方法が必要です。これを行う方法がわかりません。 Mongooseに一括オプションが見つかりませんでした。

以下の私のコード

myData = [Obj1,Obj2,Obj3.......]

myData.forEach(function(ele){
      //console.log(ele)
     saveToMongo(ele);
    });
function saveToMongo(obj){
    (new Collection1(obj)).save(function (err, response) {
          if (err) {
             // console.log('Error while inserting: ' + obj.name + " " +err);
          } else {
            // console.log('Data successfully inserted');
          }
      });

      return Collection1(obj);
  }
11

最新のMongooseバージョンを使用している場合は、ここでinsertMany()メソッドを使用できます_4.4.X_以上、本質的に- Model.collection.insertMany()を使用し、ドライバーが処理する場合があります_>= 1000_ドキュメントの並列化。

_myData = [Obj1, Obj2, Obj3.......];
Collection1.insertMany(myData, function(error, docs) {});
_

またはエラー処理を改善するためにPromiseを使用する

_Collection1.insertMany(myData)
    .then(function(docs) {
         // do something with docs
    })
    .catch(function(err) {
        // error handling here
    });
_

大量のドキュメントを作成し、それらに対して並行して.validate()を呼び出し、次に基礎となるドライバーのinsertMany() を呼び出します。 =各ドキュメントのtoObject({ virtuals: false });の結果。 insertMany()は事前保存フックをトリガーしませんが、ドキュメントごとに1回ではなく、サーバーへの1回の往復。


MongoDBサーバー_~3.8.8, ~3.8.22, 4.x_をサポートするMongooseバージョン_>=2.6.x_の場合、_Bulk API_ 次のように

_var bulk = Collection1.collection.initializeOrderedBulkOp(),
    counter = 0;

myData.forEach(function(doc) {
    bulk.insert(doc);

    counter++;
    if (counter % 500 == 0) {
        bulk.execute(function(err, r) {
           // do something with the result
           bulk = Collection1.collection.initializeOrderedBulkOp();
           counter = 0;
        });
    }
});

// Catch any docs in the queue under or over the 500's
if (counter > 0) {
    bulk.execute(function(err,result) {
       // do something with the result here
    });
}
_
26
chridam

オブジェクトの配列をmongooseモデル作成関数に渡すことができます

var Collection1 = mongoose.model('Collection1');

Collection1.create(myData,function(err){
    if(err) ...
});
1
user3227295