【问题标题】:Mongoose findOneAndUpdate and upsert returns no errs, no documents affectedMongoose findOneAndUpdate 和 upsert 不返回错误,不影响文档
【发布时间】:2014-09-26 19:11:10
【问题描述】:

我有一个非常小的模型:

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 为空。为什么我的文档没有更新?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 有点奇怪:如果文档不存在,我想简单地创建一个文档,所以conditionsupdate是一样的,但这确实解决了问题。
    • 如果你想创建一个对象然后使用插入或创建。更新是为了找到一个已经存在的对象,然后改变它的值。
    【解决方案2】:

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

    这很棘手,尤其是当请求创建一个文档时,如果你没有指定 new: true,你会收到一个空文档(没有现有的文档),但没有错误。

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

    【讨论】:

    • 你拯救了我的一天!迁移到最新版本的 mongoose 后我头疼
    猜你喜欢
    • 2017-10-14
    • 2021-07-10
    • 1970-01-01
    • 2019-02-07
    • 2015-10-30
    • 2020-08-10
    • 1970-01-01
    • 2016-05-08
    • 2016-04-25
    相关资源
    最近更新 更多