MongoDBサーバーが2.6以降の場合は、書き込みコマンドを使用することをお勧めします バルクAPI これにより、サーバー上での単純な抽象化である一括挿入操作の実行が可能になり、一括操作の構築が容易になり、大規模なコレクションに対する更新でパフォーマンスが向上します。
一括挿入操作をバッチで送信すると、サーバーへのトラフィックが少なくなるため、すべてを個別のステートメントで送信するのではなく、サーバーのコミットメントのために管理可能なチャンクに分割することで、効率的なワイヤートランザクションを実行します。このアプローチでは、コールバックでの応答を待つ時間も少なくなります。
これらの一括操作には、主に2つの種類があります。
- 注文された一括操作 。これらの操作はすべての操作を順番に実行し、最初の書き込みエラーでエラーになります。
- 順序付けられていない一括操作 。これらの操作は、すべての操作を並行して実行し、すべてのエラーを集約します。順序付けされていない一括操作は、実行の順序を保証するものではありません。
2.6より古いサーバーの場合、APIは操作をダウンコンバートすることに注意してください。ただし、100%ダウンコンバートすることはできないため、正しい数値を正しく報告できないエッジケースが発生する可能性があります。
あなたの場合、次のようにバルクAPI挿入操作を1000のバッチで実装できます。
MongoDB3.2以降の場合 bullkWrite
>
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulkUpdateOps = [];
entries.forEach(function(doc) {
bulkUpdateOps.push({ "insertOne": { "document": doc } });
if (bulkUpdateOps.length === 1000) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
bulkUpdateOps = [];
}
})
if (bulkUpdateOps.length > 0) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
}
};
MongoDB <3.2の場合
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Execute the forEach method, triggers for each entry in the array
entries.forEach(function(obj) {
bulk.insert(obj);
counter++;
if (counter % 1000 == 0 ) {
// Execute the operation
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = collection.initializeOrderedBulkOp();
callback();
});
}
});
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
callback();
});
}
};
createNewEntries()
を呼び出します 機能。
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});