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
选项
但是err
为null
, numberAffected
为null。 为什么不更新我的文档?
在你的代码中,你正在使用方法findOneAndUpdate
的3参数版本,所以根据你发布的文档,参数是: A.findOneAndUpdate(conditions, update, callback)
。
您应该使用方法的第四个参数版本来指定upsert选项。
我想指出,我从来没有使用框架mongoose。 希望这可以帮助。
编辑:是的,在你的情况下, conditions
和update
是相同的。 如果你的对象比较复杂,那么在这个例子中,你可能想要检查_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(...) {...}