2014-10-17 47 views
2

我需要更新一个数组错误而在一个阵列更新特定对象与猫鼬

{ 
    "_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) { 

        } 
       }) 

同样的错误。

请帮我找出我错过了什么,

我想即使是这样

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

没有什么工作。请帮我找出这个问题

感谢, 巴鲁

+0

从错误,似乎你正在试图改变'_id' – avi 2014-10-17 07:54:52

+0

不,我不是编号的ID。 – 2014-10-17 07:55:58

+0

您的查询对我有效 – Disposer 2014-10-17 08:16:22

回答

0

您可以尝试通过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); 
      }); 
1

使用update()方法猫鼬意味着你更新你所有的领域,包括你的_id字段,它是在蒙戈不变。这导致抛出该错误。

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

所以不是初始化事件模型,并更改属性,并使用save()方法来代替。

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

这不是一个大问题,它会导致保存模态的新对象。 只需保存你的对象在一些变种。

例如: -

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 
        }); 
       } 
      }); 
     }); 

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

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