Não está bem documentado, mas ao manipular campos de array você precisa ter certeza de que está acionando a detecção de alteração de campo do Mongoose para que ele saiba que o array foi modificado e precisa ser salvo.
Definir diretamente um elemento de matriz por meio de seu índice entre colchetes não o marca como modificado, portanto, você deve sinalizar manualmente usando
markModified
:user.emails[0] = email1;
user.markModified('emails');
Ou você pode fazer isso de uma só vez, usando o
set
método da matriz Mongoose:user.emails.set(0, email1);
A substituição de todo o campo da matriz também o aciona e é por isso que isso funciona para você:
user.emails = [email1, email2];
assim como:
user.emails = [email1];
user.emails[1] = email2;
O que significa que isso também funciona:
user.emails = [];
user.emails[0] = email1;
user.emails[1] = email2;