2016-05-22 63 views
5

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

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); 
    } 

答えて

0

以下の私のコードあなたが使用している場合は、ここでinsertMany()メソッドを使用する場合があります機能

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

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

を作成マングースモデルにオブジェクトの配列を渡すことができます最新のMongooseバージョン4.4.X以上、本質的にModel.collection.insertMany()を使用し、ドライバがパラレルライジング>= 1000あなたのためのドキュメント。

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

または

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のサーバー>=2.6.xをサポートマングースのバージョン~3.8.8, ~3.8.22, 4.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 
    }); 
} 
+0

を次のように、私は 'bulk'マングースで大量のデータを追加するためにあなたの方法をしようとしています(私は追加する409 584データがあります)が、私はちょうど273001のデータが追加されています。なぜなのかご存知ですか ? – John

+0

MongoDBサーバーのバージョンは? – chridam

+0

私はMongoDB versio 3.2.9とmongoose 4.7.2を持っています。私がinsertManyを使用すると、私は '致命的なエラーが発生しました:CALL_AND_RETRY_LAST割り当てに失敗しました - JavaScriptヒープがメモリから'私はバルクメソッドを使用しようとします。 – John

関連する問題