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 数据库中对象的某些属性

MongoDb - 使用 MongoShell 更新对象中的所有属性

以角度(mongoose/mongodb)更新模型,特别是作为模型属性的对象数组

MongoDB。如何更新数组内的json属性

MongoDB数据库中更新与删除数据

使用 AngularJS 跟踪和计算点击次数并发布到 MongoDB