mongoosefindOneAndUpdate和upsert返回没有错误,没有文件的影响

我有一个非常小的模型:

var CompanySchema = new mongoose.Schema({ name: { type: String, required: true, unique: true }, }); var Company = mongoose.model('Company', CompanySchema) 

我试图添加一个文件,如果它不存在。 目前,我testing时没有任何文件:

 models.Company.findOneAndUpdate({ name: 'companyName' }, {upsert: true}, function(err, numberAffected, raw){ console.log(err, numberAffected, raw) }) 

这是使用Mongoose文档的upsert选项

但是errnullnumberAffected为null。 为什么不更新我的文档?

在你的代码中,你正在使用方法findOneAndUpdate的3参数版本,所以根据你发布的文档,参数是: A.findOneAndUpdate(conditions, update, callback)

您应该使用方法的第四个参数版本来指定upsert选项。

我想指出,我从来没有使用框架mongoose。 希望这可以帮助。

编辑:是的,在你的情况下, conditionsupdate是相同的。 如果你的对象比较复杂,那么在这个例子中,你可能想要检查_id或者一个“唯一”(不受MongoDB保证)属性(如果它有一个索引就更好)。 例如:

 var myObj = ...; collection.findOneAndUpdate({uniqueAttr: myObj.uniqueAttr}, myObj, {upsert: true}, function(){ ... }); 

从Mongoose 4+开始,不要忘记随着upsert设置new:true ,否则你会得到旧文档作为返回值,而不是更新后的文档。

这是非常棘手的,特别是当请求创build一个文档,就像你没有指定new:true,你会收到一个空文档(没有现有的文档),但没有错误。

  var myObj = ...; collection.findOneAndUpdate( {uniqueAttr: myObj.uniqueAttr}, myObj, {upsert: true, new: true}, function(...) {...}