выполните итерацию по большой коллекции mongodb с целью обновления схемы

#mongodb #mongoose #mongoose-schema

Вопрос:

У меня есть коллекция тестовых документов объемом 300 тыс. Я хочу обновить всех людей firstName и lastName быть в нижнем регистре.

   const person = new Schema({
  firstName: { type: String},
  lastName: { type: String }

})
 

Я добавил lowecase:true в схему, но как мне обновить существующие документы?

Я пытался:

   CaseFile
  .find({ })
  .cursor()
  .eachAsync(async function (doc) {
    await doc.save()
  })
 

но я получаю ошибку

 Error: Collection method find is synchronous
 

Я тоже пытался :

    CaseFile
  .find({ })
  .then(docs => {
    docs.forEach(doc => {
      doc.save()
    })
  })
 

что приводит к ошибке:

 JavaScript heap out of memory
 

версия бд v5.0.2

«мангуст»: «^6.0.5»,

спасибо Вернфриду Домшайту за решение pipeline 🏄 :

 CaseFile.updateMany({}, [
  {
    $set:
    {
      firstName: { $toLower: '$firstName' },
      lastName: { $toLower: '$lastName' }
    }
  }]
)
  .then(res => res)
 

Ответ №1:

С какой стати «повторять», то есть строка за строкой?

Используйте конвейер агрегации:

 db.CaseFile.updateMany({}, [
   { $set: 
      firstName: { $toLower: "$firstName" },
      lastName: { $toLower: "$lastName" }
   }
])