比較的小さいデータの場合、 snapshot
カーソルのforEach()
db.wholesalers.find({
"brands": { "$exists": true, "$type": 4 }
}).snapshot().forEach(function(doc){
db.wholesalers.updateOne(
{ "_id": doc._id },
{ "$set": { "brandsNetherlands": doc.brands } }
);
});
これは小さなコレクションには最適ですが、大きなデータセットをループし、リクエストごとにサーバーに各更新操作を送信すると計算上のペナルティが発生するため、大きなコレクションのパフォーマンスは大幅に低下します。
Bulk()
APIが助けになり、書き込み操作がサーバーに一括で1回だけ送信されるため、パフォーマンスが大幅に向上します。メソッドがすべての書き込みリクエストをサーバーに送信しないため、効率が向上します( forEach()
ループ)が、1000リクエストごとに1回だけであるため、更新が現在よりも効率的かつ迅速になります。
上記と同じ概念をforEach()
このデモでは、 Bulk()
MongoDBバージョン>= 2.6 and < 3.2
で利用可能なAPI initializeUnorderedBulkOp()
並列に、および非決定論的な順序で、バッチでの書き込み操作を実行するメソッド:
var Bulk =db.wholesalers.initializeUnorderedBulkOp()、counter =0; //バッチ更新サイズを追跡するためのカウンター
db.wholesalers.find({
"brands": { "$exists": true, "$type": 4 }
}).snapshot().forEach(function(doc){
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "brandsNetherlands": doc.brands }
});
counter++; // increment counter
if (counter % 1000 == 0) {
bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
bulk = db.wholesalers.initializeUnorderedBulkOp();
}
});
次の例は、新しいMongoDBバージョン3.2
に適用されます その後、 Bulk()
は非推奨になりました。
APIと、 bulkWrite()
。
上記と同じカーソルを使用しますが、同じ forEach()
各一括書き込みドキュメントを配列にプッシュするカーソルメソッド。書き込みコマンドは1000を超える操作を受け入れることができないため、最大で1000の操作を持つように操作をグループ化し、ループが1000の反復に達したときに配列を再初期化する必要があります。
var cursor = db.wholesalers.find({
"brands": { "$exists": true, "$type": 4 }
}),
bulkUpdateOps = [];
cursor.snapshot().forEach(function(doc){
bulkUpdateOps.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "brandsNetherlands": doc.brands } }
}
});
if (bulkUpdateOps.length === 1000) {
db.wholesalers.bulkWrite(bulkUpdateOps);
bulkUpdateOps = [];
}
});
if (bulkUpdateOps.length > 0) { db.wholesalers.bulkWrite(bulkUpdateOps); }