node.js - MongoDB 只更新对象中更改的字段,而不是替换整个对象
问题描述
我想更新包含 MongoDB 中对象的文档。由于更新的对象是用户提供的,我不知道他到底要改变什么。
例如,我在用户集合中有此文档:
{
_id: 1,
date: new Date(),
info: {
first_name: "a",
last_name: "b",
phone: "c"
}
}
用户可以编辑 first_name 和 last_name 但不能编辑电话。
这是req.body
(我从用户那里收到的输入):
{
info: {
first_name: "aa"
}
}
现在,为了仅更新“info.first_name”并保留存储在 info ojbect 中的其他字段,我必须设置如下更新查询:
db.users.update({}, {$set: {"info.first_name": req.body.info.first_name}}, cb);
但是输入可以是动态的和可变的。我不知道它是否总是被更新的名字它可以是姓氏,甚至可以是其他子对象,如地址:“info.address.city”(例如)
出于这个原因,我处理这些更新是这样的:
$set: req.body
就是这样。它有效,但我对此有疑问。它替换了整个信息对象,并且不保留存储在其中的其他密钥 - 电话被删除,姓氏被删除。
有没有办法告诉 MongoDB 不要替换整个对象,而只是更新提到的那些键?
解决方案
读取数据库中的当前条目并将 req.body 分布在当前条目上会不会更容易?
// read current entry in database
let currentObject = await user.findOne({_id});
// merge current entry with changed updated key:values
let newObject = ( currentObject, ...req.body );
// write update to database
let user.findOneAndUpdate({_id}, {$set: newObject}, )
推荐阅读
- java - 遵循 Builder Pattern 的确切代码,但出现错误
- reactjs - React 应用程序不适用于 apollo 客户端,跨域错误
- java - 为什么我的代码在使用文本文件时打印空数组([])?
- ios - 在异步工作完成之前关闭返回数据
- react-native - 如何从另一个组件以编程方式在 React Native 中更改选项卡栏图标?
- mongodb - 从不同的容器连接到 mongo - 连接被拒绝
- java - 给定邻接规则和无序数组,返回符合规则的数组
- java - 在 Eclipse 中生成 JavaDocs 时出现“未找到模块”消息
- c++ - 失败,错误 87:参数不正确。如何判断哪个参数不正确?
- java - Runtime.getRuntime().exec(command) 不做任何事情