2014-10-17 32 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。