node.js - 如何仅为提供的键更新猫鼬文档的嵌套对象
问题描述
我将根据提供的键更新 mongoose 文档的某些字段。例如,当我们在 json 中呈现 mongoose 文档时。
user: {
address: {
city: "city"
country: "country"
}
}
并且更新参数是这样给出的。
address: {
city: "city_new"
}
当我像这样运行猫鼬api时。
let params = {
address: {
city: "city_new"
}
}
User.set(param)
它替换整个地址对象,最终结果是
user: {
address: {
city: "city_new"
}
}
它只是替换地址字段,但我只想更新城市字段。这是期望的结果。
user: {
address: {
city: "city_new"
country: "country"
}
}
如何在猫鼬中做到这一点?
当嵌套对象具有更复杂的层次结构时,我们如何在不手动指示字段的情况下解决这个问题address.city.field1.field2. ...
谢谢
解决方案
当嵌套对象具有更复杂的层次结构时,我们如何解决这个问题而不需要手动指示地址.city.field1.field2等字段。
正如大多数答案所暗示的那样,您必须使用点符号来更新嵌入式文档并回答上述问题,请使用以下辅助方法,该方法应用递归将给定对象转换为其点符号表示:
function convertToDotNotation(obj, newObj={}, prefix="") {
for(let key in obj) {
if (typeof obj[key] === "object") {
convertToDotNotation(obj[key], newObj, prefix + key + ".");
} else {
newObj[prefix + key] = obj[key];
}
}
return newObj;
}
let params = {
address: {
city: {
location: {
street: "new street"
}
}
}
};
const dotNotated = convertToDotNotation(params);
console.log(JSON.stringify(dotNotated, null, 4));
推荐阅读
- android - 无法更改 Android Studio 上 FloatingActionButton 布局文件中的图标颜色
- scala - 如何查看 Array 是否包含 Scala 中另一个 Java List 的值?
- tkinter - tkinter:如何在窗口之间“导航”
- c# - 如何在 WPF 中使用 Windows 多媒体 API (winmm.dll) 播放波形文件?
- python - 在 Python 中展平嵌套的 JSON API 字典
- apache-spark - 安装 spark 并配置它
- pdf - 如何在 PDF 中设置子字符串的样式(在 Adobe Acrobat 中)?
- c# - 如何在文档末尾插入一页?
- swift - 当用户单击正确答案时,如何使 quizView 以绿色 onTapGesture 显示
- html - 调整浏览器窗口大小时停止导航栏移动