Aby zwiększyć wydajność, skorzystaj z funkcji Bulk()
Interfejs API do wydajnej zbiorczej aktualizacji kolekcji, ponieważ będziesz wysyłać operacje do serwera w partiach (na przykład, powiedzmy, że wielkość partii wynosi 500). Daje to znacznie lepszą wydajność, ponieważ nie będziesz wysyłać każdego żądania do serwera, ale tylko raz na 500 żądań, dzięki czemu Twoje aktualizacje będą wydajniejsze i szybsze.
Poniżej przedstawiono to podejście, pierwszy przykład wykorzystuje Bulk()
API dostępne w wersjach MongoDB>=2.6 i <3.2. Aktualizuje wszystkie dopasowane dokumenty w kolekcji z danej tablicy, zwiększając 1 do pokazanego pola. Zakłada, że tablica obrazów ma strukturę
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" }
]
Wersje MongoDB>=2.6 i <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(); }
Następny przykład dotyczy nowej wersji MongoDB 3.2, która od tego czasu wycofała Bulk()
API i udostępnił nowszy zestaw API przy użyciu bulkWrite()
.
MongoDB w wersji 3.2 i nowszych :
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);