2014-12-05 73 views
2

我做一個蒙戈Schema.save(),它會自動做一個更新插入,但它與蒙戈DB保存試圖插入,而不是更新

E11000 duplicate key error index 

堅持試圖做一個插入,然後錯誤這是節點功能,它保存:

exports.ImpdateSave = function(req, res) { 
    var theImpdate = new Impdate(req.body) 
    if (theImpdate){ 
     var impdateId = req.params.id; 
     console.log("Node API Impdate: ", theImpdate); 
     console.log("Node API Impdate ID: ", impdateId); 
     theImpdate.save(function(err) { 
      if (err) { 
       console.log(err); 
       return res.send(400); 
      } 
      res.send(200); 
     }); 
    } else { 
     return res.status(400).send('There was no person data in the request to update. Please try again!');  
    } 
}; 

爲什麼無法找到該文件時,它並插入/更新前的初始搜索,但後來發現它時,它插入?從控制檯

輸出:

Node API Impdate: { _id: 5481c33cd8bf24f4235cff35, 
    _creator: 54679200502e901427fec6de, 
    name: 'XXXXX', 
    address: 'XXXXXXXXXXXXXXXX', 
    __v: 0} 

Node API Impdate ID: 5481c33cd8bf24f4235cff35 
{ [MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: fullstack-dev.impdates.$_id_ dup key: { : ObjectId('5481c33cd8bf24f4235cff35') }] 
    name: 'MongoError', 
    code: 11000, 
    err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: fullstack-dev.impdates.$_id_ dup key: { : ObjectId(\'5481c33cd8bf24f4235cff35\') 
    }' } 
+0

複製密鑰的價值是什麼?我認爲這是一個空字符串,或空,對嗎?無論如何,這是一種危險的方法 - 您必須*在插入前重新獲取對象;您的對象'theImpdate'完全來自客戶端,並且可以擁有任何id,即使是不屬於經過身份驗證的用戶的身份驗證用戶,它也可以讓任何用戶更新不屬於他們的數據。 – mnemosyn 2014-12-05 15:10:42

+0

沒有。已經添加了上述函數的console.log輸出... – 2014-12-05 15:15:42

+0

嗯,也許JS驅動程序使用不同的標準來識別更新。重新獲取對象是否首先解決問題? – mnemosyn 2014-12-05 15:21:22

回答

2

像你想的貓鼬的save沒有做一個更新插入。如果您在此處創建新的Impdate對象,即使包含的_id值已經存在,它也會將其視爲新文檔。

取而代之的是findOne文檔由其_id應用來自主體的新值和save或使用findByIdAndUpdate

+0

現在甜蜜地工作! (在對其他bug進行了一些調整之後!)感謝@JohnnyHK的幫助 – 2014-12-06 06:41:22