修改并保存数组中的值

时间:2015-05-04 16:47:45

标签: arrays mongodb mongoose

我有以下代码,找到包含输入电子邮件地址的成员的所有项目。我们的想法是搜索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。

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

1 个答案:

答案 0 :(得分:0)

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

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

A。 Mongoose不会为数组索引创建getter / setter;如果没有它们,mongoose永远不会收到有关更改的通知,因此不知道如何保留新值。解决方法是使用Mongoose&gt; = 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