【问题标题】:Mongoose - save document Object.assignMongoose - 保存文档 Object.assign
【发布时间】:2017-10-06 15:16:38
【问题描述】:

我有一个 mongoose 文档,我想用另一个对象更新其中的许多字段。像

Model.findById(_id, function (err, doc){
    var updateData = {...data}

    // i do not want to do 
    doc.foo = data.foo;
    doc.bar = data.bar;

    // i need something like
    doc.save(updateData)
    // or
    doc.update(updateData)
    // or
    doc = {...doc, ...updateData}
    doc.save();

});

updateData 是一个包含我需要在文档中更新的所有数据的对象。

没有找到任何相关的文档,最接近的是找到并更新...

【问题讨论】:

    标签: javascript node.js mongodb mongoose database


    【解决方案1】:

    假设您的 data 对象具有您要在文档上更新的所有键,为什么不尝试使用您在问题标题中提到的 Object.assign

    Object.assign(doc, data);
    doc.save(callback); // save is async
    

    或者你可以像这样使用 Mongo 的.findByIAndUpdate()

    Model.findByIdAndUpdate(id, { $set: data }, callback)
    

    无论哪种方式,您都可以避免手动设置要更新的每个属性。

    【讨论】:

    • 但我担心Object.assign 可能会覆盖设置器/获取器或猫鼬对象的任何重要属性。这会发生吗?
    • 我认为您应该可以按照Object.assign documentation 进行处理。 Object.assign 在源上使用get,在目标上使用set(在本例中为您的文档),因此它分配属性而不是复制它们,因此它应该遵守任何预定义的getter /setters
    • 太棒了!我正在考虑使用扩展运算符,例如{..doc, ...data},但这会创建另一个对象并且不会保留猫鼬文档。
    • 但我还有最后一个问题要确认,使用 Object.assign(doc, data),嵌套对象将被替换,或者它们将服从 mongoose 文档中的 getter/setter?
    • @AdamD 是的,我想。我很久以前就提出了这个问题,不记得了,但我检查了它是正确的答案,所以它可以工作
    【解决方案2】:

    试试这个

    //更新

    router.put("/updatestudent/:id", function(req, res) {
        var id = req.params.id;
        var obj = req.body;
        student.findByIdAndUpdate(id, { name: obj.name, emailid: obj.emailid },
            function(err) {
                if (err) {
                    return res.send('error updated student');
                }
                res.send("updated");
            });
    });
    

    【讨论】:

    • 抱歉,我需要使用当前对象,我正在尝试不再搜索该项目
    猜你喜欢
    • 2017-07-05
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2015-07-03
    • 2017-08-30
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多