Mongoose:分配字段types'string数组'

我正在使用string数组来保存电子邮件:

var user = new Schema({ // other fields... emails: [String] }); 

有麻烦更新这个领域。 说,email1和email2是我从视图中得到的值:
这很好:

 user.emails = [email1, email2]; user.save(); // fields are updated, all good 

这不是:

 user.emails[0] = email1; user.emails[1] = email2; user.save(function(err, savedUser) { console.log(savedUser.emails); // updated array [email1, email2] // but if I retrieve now the user, the 'emails' field will not have above changes. }); 

但奇怪的是,这是有效的:

 user.emails = [email1]; user.emails[1] = email2; user.save(); // user.emails == [email1, email2]; 

谁能解释为什么会发生这种情况?

这是没有很好的文件,但是当操纵数组字段,你需要确保你正在触发Mongoose的字段变化检测,以便它知道该数组已被修改,并需要保存。

通过方括号中的索引直接设置数组元素不会将其标记为已修改,因此您必须使用markModified手动标记它:

 user.emails[0] = email1; user.markModified('emails'); 

或者你可以使用Mongoose数组的set方法:

 user.emails.set(0, email1); 

覆盖整个数组字段也会触发它,这就是为什么这适用于你的原因:

 user.emails = [email1, email2]; 

以及:

 user.emails = [email1]; user.emails[1] = email2; 

这意味着这也是可行的:

 user.emails = []; user.emails[0] = email1; user.emails[1] = email2;