Я столкнулся с похожим сценарием и в котором я создал сценарий для обновления около 25 миллионов документов, и для обновления всех документов потребовалось много времени. Чтобы повысить производительность, я один за другим вставил обновленный документ в новую коллекцию и переименовал новую коллекцию. Этот подход помог, потому что я вставлял документы, а не обновлял их (операция «вставки» выполняется быстрее, чем операция «обновление»).
Вот пример сценарий (я не проверял):
/*This method returns postHour*/
function convertPostTimeToPostHour(postTime){
}
var totalCount = db.person.count();
var chunkSize = 1000;
var chunkCount = totalCount/chunkSize;
offset = 0;
for(index = 0; index<chunkCount; index++){
personList = db.persons.find().skip(offset).limit(chunkSize);
personList.forEach(function (person) {
newPerson = person;
newPerson.post_hour = convertPostTimeToPostHour(person.post_time);
db.personsNew.insert(newPerson); // This will insert the record in a new collection
});
offset += chunkSize;
}
Когда выше написанный сценарий будет выполнен, новая коллекция «personNew» будет иметь обновленные записи со значением поля «post_hour ' задавать.
Если у существующей коллекции есть какие-либо индексы, вам необходимо воссоздать их в новой коллекции.
После этого индексы создаются, вы можете переименовать имя коллекции «человек» в «personOld» и «personNew» на «person».
Я уверен, что выполнение каждого фрагмента в отдельной оболочке также может повысить скорость работы. –