В оболочке mongo вы можете использовать метод bulkWrite()
, предназначенный для быстрой и эффективной реализации обновлений. Рассмотрим следующий пример:
var entitiesCol = db.getCollection('entities'),
counter = 0,
ops = [];
entitiesCol.find({
"type": "item",
"prices.0": { "$exists": false }
}).snapshot().forEach(function(item){
ops.push({
"updateOne": {
"filter": { "_id": item._id },
"update": {
"$push": {
"prices": { "value": item.price }
}
}
}
});
counter++;
if (counter % 500 === 0) {
entitiesCol.bulkWrite(ops);
ops = [];
}
})
if (counter % 500 !== 0)
entitiesCol.bulkWrite(ops);
counter
переменная выше есть управлять сыпучие обновления эффективно, если ваша коллекция велика. Он позволяет выполнять операции обновления и отправлять записи на сервер пакетами 500, что дает вам лучшую производительность, так как вы не отправляете каждый запрос на сервер всего один раз в каждые 500 запросов.
Для массовых операций MongoDB налагает default internal limit of 1000 операций на каждую партию, и поэтому выбор 500 документов хорош в том смысле, что у вас есть некоторый контроль над размером партии, а не для MongoDB накладывать значение по умолчанию, то есть для более крупных операций с величиной из 1000 документов.
Какова ваша версия Mongoose и MongoDB? – chridam
MongoDB 3.2.11 Я думаю, – Burak