2016-03-03 68 views
2

在Heroku上使用MEAN Stack部署我能夠使用mongoDB的findOnedeleteOne函數GETDELETE函數。然而,當我嘗試PUT文檔與MongoDB的updateOne/update功能,收到這個錯誤(服務器端):MongoDB objectID陌生人錯誤

的_id字段不能從改變{_id:的ObjectId( '56d4d71191fdc81100974d0b')}至{ _id:「56d4d71191fdc81100974d0b」}。

似乎有些奇怪,因爲我使用在updateOne我的服務器代碼相同的方法在findOne(再次,findOne正常工作):

app.get("/contacts/:id", function(req, res) { 
    db.collection(CONTACTS_COLLECTION).findOne({ _id: new ObjectID(req.params.id) }, function(err, doc) { 
    if (err) { 
     handleError(err.message, "Failed to get contact"); 
    } else { 
     res.status(200).json(doc); 
    } 
    }); 
}); 

app.put("/contacts/:id", function(req, res) { 
    var updateDoc = req.body; 
    db.collection(CONTACTS_COLLECTION).updateOne({_id: new ObjectID(req.params.id)}, updateDoc, function(err, doc) { 
    if (err) { 
     handleError(err.message, "Failed to update contact"); 
    } else { 
     res.status(204).end(); 
    } 
    }); 
}); 

有什麼建議?

+0

你正在做的更新和更新的文檔包含一個_id,蒙戈不喜歡這一點。從updateDoc中刪除_id:'delete updateDoc._jd'。 – Shanoor

回答

1

我想你在var updateDoc = req.body

有問題,因爲req.body包含id字段,並正在從對象搜索通過ID更新,MongoDB的認爲你只是試圖更新 id字段太這是不允許的。

一個解決方案是從您的updateDoc對象中刪除id字段。 例如

delete updateDoc._id; 

現在再試一次,看看它是否工作。

您的最終功能應該像

app.put("/contacts/:id", function(req, res) { 
    var updateDoc = req.body; 
    delete updateDoc.id; 

    db.collection(CONTACTS_COLLECTION).updateOne({_id: new ObjectID(req.params.id)}, updateDoc, function(err, doc) { 
    if (err) { 
     handleError(err.message, "Failed to update contact"); 
    } else { 
     res.status(204).end(); 
    } 
    }); 
}); 
+0

完美運作。非常感謝。我在這方面花費了太多時間 –