2014-07-07 38 views
14

我想使用GUI更新集合(单位)中的文档,并在它得到更新后我想更新值(user.Units这是一个数组单位名称)集合(用户)。如果数组长度只是1个元素,它会被更新,并且在数据库中显示出来,并且一切正常,但是当Array of Units有多个元素时,我尝试通过for循环更新它,它显示它会被更新,但是当我检查数据库,它仍然没有更新。Mongoose保存()不更新数组中的值

我真的不知道为什么它不更新数据库时,我通过循环更新值。

全体编辑和更新功能: -

edit_unit: function (req, res, next) { 
    var Data = req.body; 

    Client_data.Unit.findById(req.params.unitId, function (err, unit) { 
     var error = false; 
     if (err) { 
      error = err; 
     } else if (!unit) { 
      error = "FATAL: unable to look up Unit #" + req.params.unitId; 
     } else { 

      switch(req.body.name) { 
       case 'Icon': 
        var Icon = unit.Icon; 

        User.find({"Units":Icon}, function (err, users) { 
         if (err) 
         console.log(err); 

         users.forEach(function (u) { 
          if (u.Units.length > 1) { 
          for (var i = 0; i <= u.Units.length; i++) { 
           if(u.Units[i] == Icon) { 
            u.Units[i] = req.body.value; 
           } 
          } 
          } 
          else { 
           u.Units = req.body.value; 
          } 
          u.save(u); 
         }); 
        }); 
        unit[req.body.name] = req.body.value; 
        break; 
       case 'Description': 
        unit[req.body.name] = req.body.value; 
        break; 
       default: 
        unit[req.body.name] = req.body.value; 
        break; 
      } 
      var data = JSON.stringify(req.body); 
      unit.save(); 

      res.writeHead(200, { 
       'Content-Length': data.length, 
       'Content-Type': 'application/json' 
      }); 
      res.end(data); 
     } 
    }); 
} 

req.body: -

{ name: 'Icon', 
    value: 'Health Utility 22c', 
    pk: '5395ed107cd92dc40eaafb56' 
} 

用户模式: -

var userSchema = mongoose.Schema({ 
UserName:  { type: String, required: true }, 
Password:  { type: String }, 
FirstName: { type: String, required: true }, 
LastName:  { type: String, required: true }, 
CompanyName: { type: String }, 
PhoneNumber: { type: Number }, 
StartDate: { type: Date, required: true }, 
EndDate:  { type: Date, required: true, default: new Date('9999-12-12') }, 
ClientID:  { type: ObjectId, ref: 'Client', default: null }, 
DepartmentID: { type: ObjectId, ref: 'Department' }, 
ManagerID: { type: ObjectId, ref: 'User', default: null}, 
Units:  [ { type: String, required: true } ], 
UserList:  { type: Array, default:[]}, 
Access: [{ type: String, enum: ['DEMO', 'USER','MANAGER','ADMINISTRATOR','OWNER']}], 
Credentials: { type: String }, 
AFTE:   { type: Number}, 
SessionID: { type: String, default: null } 
}, { safe: true }); 
+0

你可以编辑你的问题来包含'User'的模式定义吗? – JohnnyHK

回答

41

五月是通知mongooose数据集已经改变这样的:

doc.markModified('pathToYourAttribute')  

从文档http://mongoosejs.com/docs/schematypes.html

person.anything = { x: [3, 4, { y: "changed" }] }; 
person.markModified('anything'); 

希望它的帮助!

+1

什么是“PathToYourAttribute”?,对不起,我对猫鼬有点新鲜。 –

+0

@SulemanMirza我编辑我的答案,我从文档 – cvng

+0

@SulemanMirza为什么会发生这种情况?在类似的情况下。 –

3

请参阅this issue。解决这个问题的一种方法不是通过经典的数组索引方法来更新数组。所以,这样做反而

doc.array[index] = value; 

doc.array.set(index, value); 

也查看FAQdoc的更多细节。

+0

这不适用于一组对象,这是OP的情况。对此有何修改? – Doa

+0

这为我工作 – Mark