現在、Mongoose v3.6 +はバッチ挿入をサポートしていますか? 数分間検索しましたが、このクエリに一致するものはすべて数年前のものであり、答えは明確なノーでした.
編集:
今後の参考のために、答えは を使用することModel.create()
です。create()
最初の引数として配列を受け入れるため、挿入するドキュメントを配列として渡すことができます。
Model.create() のドキュメントを参照してください
現在、Mongoose v3.6 +はバッチ挿入をサポートしていますか? 数分間検索しましたが、このクエリに一致するものはすべて数年前のものであり、答えは明確なノーでした.
編集:
今後の参考のために、答えは を使用することModel.create()
です。create()
最初の引数として配列を受け入れるため、挿入するドキュメントを配列として渡すことができます。
Model.create() のドキュメントを参照してください
Mongoose 4.4.0 では、model メソッドを使用した --true--bulk insert が導入されました.insertMany()
。ループし.create()
たり、配列を提供したりするよりもはるかに高速です。
使用法:
var rawDocuments = [/* ... */];
Book.insertMany(rawDocuments)
.then(function(mongooseDocuments) {
/* ... */
})
.catch(function(err) {
/* Error handling */
});
または
Book.insertMany(rawDocuments, function (err, mongooseDocuments) { /* Your callback function... */ });
あなたはそれを追跡することができます:
実際、Mongoose の「作成」メソッドを使用できます。これには、ドキュメントの配列を含めることができます。次の例を参照してください。
Candy.create({ candy: 'jelly bean' }, { candy: 'snickers' }, function (err, jellybean, snickers) {
});
コールバック関数には、挿入されたドキュメントが含まれています。挿入する必要がある項目の数 (上記のように引数の長さが固定されている) が常にわかっているとは限らないため、それらをループすることができます。
var insertedDocs = [];
for (var i=1; i<arguments.length; ++i) {
insertedDocs.push(arguments[i]);
}
より良い解決策は、Candy.collection.insert()
代わりに使用することですCandy.create()
-上記の例で使用されています-より高速であるためです(各アイテムcreate()
で呼び出しModel.save()
ているため、低速です)。
詳細については、Mongo のドキュメントを参照してください: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(これを指摘してくれたarcseldonに感謝)
最高スコアの回答として、マングースを使用して一括挿入を実行できます。ただし、この例は機能しません。次のようにする必要があります。
/* a humongous amount of potatos */
var potatoBag = [{name:'potato1'}, {name:'potato2'}];
var Potato = mongoose.model('Potato', PotatoSchema);
Potato.collection.insert(potatoBag, onInsert);
function onInsert(err, docs) {
if (err) {
// TODO: handle error
} else {
console.info('%d potatoes were successfully stored.', docs.length);
}
}
一括挿入にスキーマ インスタンスを使用しないでください。プレーンなマップ オブジェクトを使用する必要があります。
配列に値を挿入することで、mongoDB シェルを使用して一括挿入を実行できます。
db.collection.insert([{values},{values},{values},{values}]);
マングースを使うと1000ドキュメント以上の制限があるようですが、
Potato.collection.insert(potatoBag, onInsert);
以下を使用できます。
var bulk = Model.collection.initializeOrderedBulkOp();
async.each(users, function (user, callback) {
bulk.insert(hash);
}, function (err) {
var bulkStart = Date.now();
bulk.execute(function(err, res){
if (err) console.log (" gameResult.js > err " , err);
console.log (" gameResult.js > BULK TIME " , Date.now() - bulkStart );
console.log (" gameResult.js > BULK INSERT " , res.nInserted)
});
});
しかし、10000 個のドキュメントでテストすると、これはほぼ 2 倍の速度になります。
function fastInsert(arrOfResults) {
var startTime = Date.now();
var count = 0;
var c = Math.round( arrOfResults.length / 990);
var fakeArr = [];
fakeArr.length = c;
var docsSaved = 0
async.each(fakeArr, function (item, callback) {
var sliced = arrOfResults.slice(count, count+999);
sliced.length)
count = count +999;
if(sliced.length != 0 ){
GameResultModel.collection.insert(sliced, function (err, docs) {
docsSaved += docs.ops.length
callback();
});
}else {
callback()
}
}, function (err) {
console.log (" gameResult.js > BULK INSERT AMOUNT: ", arrOfResults.length, "docsSaved " , docsSaved, " DIFF TIME:",Date.now() - startTime);
});
}