Mongoose:指定“字符串数组”类型的字段

时间:2014-10-17 10:56:12

标签: node.js mongodb express mongoose

我正在使用字符串数组来保存电子邮件:

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];

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:11)

没有详细记录,但在操作数组字段时,您需要确保触发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;