【问题标题】:Mongoose: assign field of type 'array of Strings'Mongoose:分配类型为“字符串数组”的字段
【发布时间】:2014-12-12 22:44:59
【问题描述】:

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

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

谁能解释为什么会这样?

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    没有很好的文档记录,但是在操作数组字段时,您需要确保触发 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;
    

    【讨论】:

    • 非常感谢!!!你知道它如何在我的测试中工作而不触发字段更改检测吗?
    • @eagor 哪个案例在您的测试中出乎意料地起作用了?
    • 单独设置元素(user.emails[0] = email1...)。在“开发”环境中没有效果,但在“测试”中运行良好(更新了新检索到的对象数组)
    • 添加关于使用 push 和 splice 等功能的注释会很棒
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多