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 的 save() 方法保存