Mongoose - 保存文档 Object.assign

Posted

技术标签:

【中文标题】Mongoose - 保存文档 Object.assign【英文标题】:Mongoose - save document 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 是一个包含我需要在文档中更新的所有数据的对象。

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

【问题讨论】:

【参考方案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");
        );
);

【讨论】:

抱歉,我需要使用当前对象,我正在尝试不再搜索该项目

以上是关于Mongoose - 保存文档 Object.assign的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 保存文档 Object.assign

Mongoose如何将文档保存在数组中

文档不会使用带有 mongoose 的 save() 方法保存

使用 mongoose 保存子文档数组会创建空数组 MEAN 堆栈

Mongoose 在 forEach() 中保存相同的文档

在 mongoose 中保存时使用 ObjectId 参考文档