Mongoose findOneAndUpdate和upsert返回没有错误,没有文档受到影响

时间:2014-08-04 10:21:27

标签: javascript node.js mongodb mongoose

我有一个非常小的模型:

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

var Company = mongoose.model('Company', CompanySchema)

我正在尝试添加单个文档(如果它不存在)。目前,我测试时没有文件:

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

这是使用upsert options from the Mongoose docs

errnullnumberAffected为空。为什么我的文件没有更新?

2 个答案:

答案 0 :(得分:25)

在您的代码中,您正在使用方法findOneAndUpdate的3参数版本,因此,根据您发布的文档,参数为:A.findOneAndUpdate(conditions, update, callback)

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

我想指出我从未使用过框架猫鼬。希望这会有所帮助。

编辑: 是的,在您的情况下,conditionsupdate是相同的。如果您的对象比示例中显示的对象更复杂,您可能需要检查_id或" unique" (不受MongoDB保证)属性(如果它有索引,则更好)。例如:

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

答案 1 :(得分:25)

从Mongoose 4+开始,不要忘记将 new:true 与upsert一起设置,否则您将获取旧文档作为返回值,而不是更新的值。

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

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