MongoDB 更新对象并删除属性?
Posted
技术标签:
【中文标题】MongoDB 更新对象并删除属性?【英文标题】:MongoDB update object and remove properties? 【发布时间】:2016-08-28 17:06:19 【问题描述】:我已经搜索了几个小时,但我找不到任何关于此的信息。
情况: 后端,现有的 NodeJS + Express + Mongoose(当然还有 MongoDB)。
-
前端从后端检索对象。
前端进行了一些更改(添加/更新/删除一些属性)。
现在我使用猫鼬:PersonModel.findByIdAndUpdate(id, updatedPersonObject);
结果:添加的属性已添加。更新的属性已更新。删除的属性...仍然存在!
现在我一直在寻找一种优雅的方法来解决这个问题,但我能想到的最好的方法是:
var properties = Object.keys(PersonModel.schema.paths);
for (var i = 0, len = properties.length; i < len; i++)
// explicitly remove values that are not in the update
var property = properties[i];
if (typeof(updatedPersonObject[property]) === 'undefined')
// Mongoose does not like it if I remove the _id property
if (property !== '_id')
oldPersonDocument[property] = undefined;
oldPersonDocument.save(function()
PersonModel.findByIdAndUpdate(id, updatedPersonObject);
);
(我什至没有包含获取旧文档的琐碎代码)。
我必须为每个我想更新的对象写这个。我很难相信这是处理这个问题的最佳方式。有什么建议吗?
编辑:
我发现的另一种解决方法:要在 MongoDB 中取消设置值,您必须将其设置为未定义。
如果我在前端设置这个值,它会在 REST 调用中丢失。所以我在前端将其设置为null
,然后在后端将所有空值转换为未定义。
不过还是很丑。一定有更好的办法。
【问题讨论】:
你看这篇帖子***.com/questions/30419575/…了吗? 是的,我读过,但与我的问题无关(我需要添加更多信息吗?) 差不多五年后,这仍然是坏的。我今天遇到了。 【参考方案1】:如果您想知道有多少文档与您的过滤条件匹配以及有多少已更改(我相信它只会更改一个文档,因此知道这可能没有用),您可以使用 replaceOne()。文档:https://mongoosejs.com/docs/api/model.html#model_Model.replaceOne
如果您想查看文档,也可以使用 findOneAndReplace。我不知道传递给回调的是旧文档还是新文档;文档说Finds a matching document, replaces it with the provided doc, and passes the returned doc to the callback.
,但你可以自己测试。文档:https://mongoosejs.com/docs/api.html#model_Model.findOneAndReplace
所以,而不是:
PersonModel.findByIdAndUpdate(id, updatedPersonObject);
,你可以这样做:
PersonModel.replaceOne( _id: id , updatedPersonObject);
只要您在要用于替换旧文档的对象上拥有所需的所有属性,就可以开始使用了。
【讨论】:
以上是关于MongoDB 更新对象并删除属性?的主要内容,如果未能解决你的问题,请参考以下文章
MongoDb - 使用 MongoShell 更新对象中的所有属性