【问题标题】:Modifying and saving a value in an array修改和保存数组中的值
【发布时间】:2015-07-14 03:38:41
【问题描述】:

我有以下代码,可以找到所有包含输入电子邮件地址的成员的项目。这个想法是它搜索 NFtest@test.com(作为示例)并将其更改为他们输入的名称。

有问题的代码

Project.find({ _members: req.body.email }, function(err, projects) {
  for (var i = 0, len = projects.length; i < len; i++) {
    for (var x = 0, lent = projects[i]._members.length; x < lent; x++) {
      if (projects[i]._members[x] == ["NF" + req.body.email]) {
        console.log("FOUND MATCH")
        projects[i]._members[x].value = req.body.alias
        projects[i].save()
      }
    }
  }

控制台日志告诉我已找到匹配项,但数组中的值从未更新。我想知道是否有正确的方法来更改数组中的值,而不仅仅是使用 = 运算符。还是我没有正确保存文档?

示例项目文档

"_id" : ObjectId("5546"),
"name" : "Test project",
"description" : "This is a sample description",
"archived" : false,
"admins" : [
       "test@test.com"
],
"_members" : [
        "membertoupdate@test.com",
        "NFmembertoupdate@test.com"
],
"updated" : ISODate("2015=05=04T04:52:22:787Z")

这个想法是用一个名字更新 NFmembertoupdate@test.com。此名称来自 req.body.alias。

控制台告诉我找到了一个匹配项并且没有抛出任何错误,但是没有进行更新。

【问题讨论】:

  • 你能给我们展示一些示例文件和预期的输出吗?

标签: arrays mongodb mongoose


【解决方案1】:

问。为什么当我直接更新元素时​​我对数组的更改没有保存?

doc.array[3] = 'changed';
doc.save();

A. Mongoose 不会为数组索引创建 getter/setter;没有它们,猫鼬永远不会收到更改通知,因此不知道要保留新值。解决方法是使用 Mongoose >= 3.2.0 中可用的 MongooseArray#set。

// 3.2.0
doc.array.set(3, 'changed');
doc.save();

// if running a version less than 3.2.0, you must mark the array modified before saving.
doc.array[3] = 'changed';
doc.markModified('array');
doc.save();

来自Mongoose FAQ

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多