Итерации по коллекции MongoDB для дублирования всех документов мучительно медленны

Nate Vaughan спросил: 13 октября 2017 в 06:44 в: mongodb

У меня есть коллекция из 7 000 000 документов (каждый из которых может быть размером 1-2 КБ BSON) в коллекции MongoDB, которую я хотел бы продублировать, изменив одно поле. Поле представляет собой строку с числовым значением, и я хотел бы увеличить поле на 1.

Следуя этому подходу , из оболочки Mongo я взял следующий подход:

> var all = db.my_collection.find()
> all.forEach(function(it) { 
... it._id = 0; // to force mongo to create a new objectId
... it.field = (parseInt(it.field) + 1).toString();
... db.my_collection.insert(it);
... })

Выполнение следующего кода занимает очень много времени; сначала я думал, что код каким-то образом нарушен, но из отдельного терминала я проверил состояние коллекции примерно через час, чтобы убедиться, что процесс все еще запущен, и теперь было 7 000 001 документов! Я проверил, чтобы убедиться, что достаточно точно, это был ровно 1 новый документ, который соответствовал увеличенному полю.

Для контекста, я запускаю MBP 2015 с 4 ядрами и 16 ГБ оперативной памяти. Я вижу mongo в верхней части моего процессора, в среднем около 85%.

1) Мне не хватает возможности массового изменения / обновления в Mongodb?

2 ) Есть ли причина, по которой вышеприведенная операция будет работать, но при этом будет работать так медленно, что она обновляет документ со скоростью 1 / час?

0 ответов