2014-06-08 113 views
15

這裏有幾個問題,但我似乎無法找到似乎是目前被接受的方法的解決方案。MongoError:不允許在_id上使用

我試圖更新MongoDB中的文檔,我正在使用Mongoosejs來做到這一點。不過,我得到這個錯誤:

{ [MongoError: Mod on _id not allowed] 
    name: 'MongoError', 
    lastErrorObject: 
    { err: 'Mod on _id not allowed', 
    code: 10148, 
    n: 0, 
    connectionId: 35, 
    ok: 1 }, 
    ok: 0, 
    errmsg: 'Mod on _id not allowed' } 

我使用,使更新的代碼是:

app.put('/task/:short', auth, function (req, res) { 
    Task.findOneAndUpdate({short:req.params.short}, req.body, function(err, task) { 
    if(err) console.log(err); 
    res.json(200, {content: task}); 
    }) 
}); 

,因爲我有一個「場」被稱爲「short_id」我想這可能成爲字段名稱的「_id」部分的問題,因此我將其更改爲「short」,但仍然沒有運氣 - 我得到相同的錯誤。後來我發現它認爲我試圖改變_id字段,但我不明白爲什麼。

+0

你作爲req.body傳入了什麼? –

+0

我在'req.body'中傳遞'_id',我不應該這樣做? – tommyd456

+1

嗯,不,_id只能(可能)在搜索部分,而不是更新部分(req.body) –

回答

28

問題是因爲我正在使用short(這是唯一的)來查找文檔並更新它,並且_id正在作爲值發送以更新哪些無法完成。

因此,在發送參數之前,我從對象中刪除了_id

delete the_object._id 

和一切現在工作。

+0

很感謝!它幫助了我 – ekqnp

7

如果使用lodash,下面的代碼可以幫助..

var id = update._id; 
var update = _.omit(update,'_id'); 
mongo.mCustomers.findOneAndUpdate({_id:id},update,callback); 
4

我有測試上的MongoDB 3.X本地傳球,但我得到的CircleCI這個錯誤(持續集成服務),這運行舊版本(2.4.x)

原來安裝新版本修復了我遇到的問題。

0

這個問題在MongoDB版本3.6中不存在,但在我們的生產服務器上使用2.4版本時就成了問題。