Non è ben documentato, ma quando si manipolano i campi dell'array è necessario assicurarsi di attivare il rilevamento delle modifiche al campo di Mongoose in modo che sappia che l'array è stato modificato e deve essere salvato.
L'impostazione diretta di un elemento dell'array tramite il suo indice tra parentesi quadre non lo contrassegna come modificato, quindi è necessario contrassegnarlo manualmente utilizzando markModified
:
user.emails[0] = email1;
user.markModified('emails');
Oppure puoi farlo in una volta sola, utilizzando il set
metodo dell'array Mongoose:
user.emails.set(0, email1);
Anche la sovrascrittura dell'intero campo dell'array lo attiva ed è per questo che funziona per te:
user.emails = [email1, email2];
così come:
user.emails = [email1];
user.emails[1] = email2;
Ciò significa che funziona anche questo:
user.emails = [];
user.emails[0] = email1;
user.emails[1] = email2;