使用Mongoose更新数组中的特定对象时出错

我需要更新数组中的特定对象

{ "_id": "543e2f8e769ac100008777d0", "createdDate": "2014-10-15 01:25 am", "cancle": false, "eventDateAndTime": "2014-02-12 12:55 am", "eventstatus": true, "userPhone": "44444444", "userId": "54334def7e85de48638d1069", "createdBy": "four", "eventName": "real tea", "__v": 0, "friends": [ { "phoneNumber": "11111111", "userName": "one", "userId": "54310801e2659ecc3650100b", "status": 0 }, { "phoneNumber": "22222222", "userName": "two", "userId": "54310814e2659ecc3650100c", "status": 1 } ] } 

我尝试了很多,我不知道我错过了什么。

 event.update( function(err, eventSaved) { if(err) { res.json({'err':err}); } }) 

我收到错误响应

 err: { name: "MongoError" code: 66 err: "After applying the update to the document {_id: ObjectId('543e2ecb74d70100001545ad') , ...}, the (immutable) field '_id' was found to have been altered to _id: ObjectId('543e2f8e769ac100008777d0')" } 

我也试过了

 event.update({'friends.userId': req.param.friendId}, {'$set': { 'friends.$.status': status }}, function(err, eventSaved, eve) { if(err) { } }) 

同样的错误。

请帮我弄清楚我缺less的东西,

我甚至试过这个

 Events.findOneAndUpdate({_id: req.params.eventId}, {$set: {'friends[keyValue].status': 7 }}, {upsert: true, "new": false}).exec(function(err, thing) { console.dir(thing); }); 

没有任何工作 请帮我弄清楚这个问题

谢谢,巴鲁

使用update()mongoose方法意味着你正在更新所有的字段,包括你在Mongo中不可变的_id字段。 这导致抛出该错误。

 event.update(function(err, eventSaved) { if(err) { res.json({'err':err}); } }) 

因此,请改为初始化您的事件模型,并更改属性,并使用save()方法。

 event.save(function(err, eventSaved){ //some code here }) 

您可以尝试传递值中的id字段进行更新,就像通过传递值来更新控制台一样,它会附加新的_id字段。 所以试试以下方法:

 Events.findOneAndUpdate({_id: req.params.eventId}, {$set: {'friends[keyValue].status': 7, _id: req.params.eventId }}, {upsert: true, "new": false}).exec(function(err, thing) { console.dir(thing); }); 

这不是一个大问题,这是由于为模态保存新对象造成的。 只需保存你的对象在一些变种。

例如: –

 router.put('/brand/:id', function (req, res) { var brand = { Name: req.body.Name, Description: req.body.Description, Date_Modify: moment() }; Brand.findByIdAndUpdate(req.params.id, brand, { new: true }, function (error, doc) { if (error) { if (error.code == 11000) { res.json({ success: false, message: 'Update Failed ,Brand Name Already Exist.' }); } else { res.json({ success: false, message: error }); } } else if (doc) { res.json({ success: true, status: res.statusCode, message: 'Brand Updated Successfully.', data: doc }); } else { res.json({ success: false, status: 404, message: 'Brand Not Found.', data: doc }); } }); }); 

你可以通过它来解决你的问题。

实际上,当它使对象创build一个新的对象(_id),所以它不能保存新的ID。