node.js - Mongoose:分配类型为 'array of Strings' 的字段

标签 node.js mongodb express mongoose

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

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/

相关文章:

node.js - Heroku Node JS 应用程序错误 - 表示找不到我的主模块

java - 如何将从 MongoDB 查询获得的年份和星期转换为 Joda 日期时间?

node.js - nodemon 应用程序在尝试请求 mongoose 时崩溃

node.js - NodeJs/Express 请求被 SetTimeout 阻止?

javascript - 如何防止 ChildProcess 内存不足? Electron/Node.js

node.js - nodejs中fs.open()有什么用,fs.readfile和fs.open()有什么区别

mongodb - order_by mongoengine中listfield的长度

java - 使用 getCollection 不再可能进行initializeOrderedBulkOperation

javascript - 如何向 Vue.js Okta 身份验证应用程序添加注册

javascript - Heroku Node.js WebSocket 服务器错误 : 'Connection' header value is not 'Upgrade' : Upgrade