我正在使用字符串数组来保存电子邮件:
var user = new Schema({
// other fields...
emails: [String]
});
更新此字段时遇到问题。比如,email1 和 email2 是我从 View 中收到的值:
这很有效:
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');
或者您可以使用 set
一次性完成Mongoose数组的方法:
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;
关于node.js - Mongoose:分配类型为 'array of Strings' 的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26423508/