パフォーマンスを向上させるには、 Bulk()
を使用してください。 バッチでサーバーに操作を送信するため、コレクションを効率的に一括更新するためのAPI(たとえば、バッチサイズ500)。これにより、すべてのリクエストをサーバーに送信するのではなく、500リクエストごとに1回だけ送信するため、パフォーマンスが大幅に向上し、更新がより効率的かつ迅速になります。
以下はこのアプローチを示しています。最初の例ではBulk()
を使用しています。 MongoDBバージョン>=2.6および<3.2で利用可能なAPI。表示されたフィールドに1をインクリメントすることにより、コレクション内の一致したすべてのドキュメントを特定の配列から更新します。画像の配列が構造を持っていることを前提としています
var images = [
{ "_id": 1, "name": "img_1.png" },
{ "_id": 2, "name": "img_2.png" }
{ "_id": 3, "name": "img_3.png" },
...
{ "_id": n, "name": "img_n.png" }
]
MongoDBバージョン>=2.6および<3.2 :
var bulk = db.images.initializeUnorderedBulkOp(),
counter = 0;
images.forEach(function (doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$inc": { "shown": 1 }
});
counter++;
if (counter % 500 === 0) {
// Execute per 500 operations
bulk.execute();
// re-initialize every 500 update statements
bulk = db.images.initializeUnorderedBulkOp();
}
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }
次の例は、 Bulk()
が廃止された新しいMongoDBバージョン3.2に適用されます。 APIを使用し、 bulkWrite()
を使用して新しいAPIセットを提供しました 。
MongoDBバージョン3.2以降 :
var ops = [];
images.forEach(function(doc) {
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$inc": { "shown": 1 }
}
}
});
if (ops.length === 500 ) {
db.images.bulkWrite(ops);
ops = [];
}
})
if (ops.length > 0)
db.images.bulkWrite(ops);