Mongodb Save尝试插入而不是更新

时间:2014-12-05 14:47:30

标签: node.js mongodb mongoose save

我正在做一个Mongo Schema.save(),它应该自动执行upsert,但它坚持尝试插入然后使用

进行错误
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\')
  }' }

1 个答案:

答案 0 :(得分:2)

Mongoose的save没有像你想的那样做一个upsert。当您在此处创建新的Impdate对象时,即使已包含的_id值已存在,也会将其视为新文档。

相反,_id提供findOne文档,应用正文中的新值和save,或使用findByIdAndUpdate