我有这个代码,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'));
}
});
答案 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);
}
});
});