2014-12-05 71 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