Mongoose model.save()没有按预期工作

时间:2015-08-20 23:44:47

标签: node.js mongodb mongoose

我有这个代码,MongoDB在我尝试保存新文档后传回了一个错误:

   var data = {
       _id: '55d65cfde9cf73322361860b'  // _id is a string here
    };

   var model = new Model(data);

    model.save(function (err, result) {
        if (err) {
            done(err);  //the error is captured here in my code
        }
        else{
            done(null, result);
        }
    });

我收到错误:

MongoError: E11000 duplicate key error index: dev_local_db_smartconnect.jobs.$_id_ dup key: { : ObjectId('55d65cfde9cf73322361860b') }

但是,我认为save会更新模型/文档(如果它存在)(通过使用隐式upsert = true选项),并且它将使用_id字段来查找现有文档。

有谁知道为什么会出现这种错误?

另一方面,这对我有用:

where data is the new data for the model, and _id is a string not an ObjectID, and Model is the mongoose class, not the instance.

 Model.update({_id:_id}, {$set: data}, {upsert:true} , function(err,result){
                if (err) {
                    done(err);
                }
                else if (result) {
                    done(null, result);
                }
                else {
                    done(new Error('grave error'));
                }
        });

1 个答案:

答案 0 :(得分:2)

由于您正在创建一个新的本地文档,因此Mongoose不知道它已经存在于服务器上,因此它会尝试将其另存为新文档。然后,Mongo将拒绝该文档,因为已存在具有该ID的现有文档。

如果先查询该文档然后保存返回的文档,它将按预期工作。像这样:

Model.find({id: '55d65cfde9cf73322361860b'}, function (err, doc) {
  // update doc with something
  // ...

  doc.save(function (err, result) {
    if (err) {
      done(err);  //the error is captured here in my code
    }
    else {
      done(null, result);
    }
  });
});