Mongoose嵌套Map无法直接赋值?如何正确设置嵌套Map内的字段值
原因说明
- Mongoose 顶层 Document 的
set()方法默认只会解析 Schema 顶层定义的路径,对于 Map 内部嵌套的子 Map 路径,不会自动递归解析为 Map 的 key 访问,传入的users.jose.holding.itc路径会被识别为不存在的普通字段路径,因此修改不生效。 - 只有触发 Mongoose 的脏数据标记逻辑,修改才会同步到实例以及后续的持久化操作中,直接通过顶层路径赋值无法触发嵌套 Map 的脏标记。
解决方法
方法1:操作实例的子Map对象
如果你已经拿到了文档实例,直接获取到上层的holding Map实例,调用其自带的set方法修改,是兼容性最高的写法:
// 获取jose对应的holding Map实例 const joseHolding = user.get('users.jose.holding'); // 调用Map原生set方法修改值 joseHolding.set('itc', 1000); // 验证修改 console.log(user.get('users.jose.holding.itc')); // 输出1000 // 调用save持久化到数据库 await user.save();
方法2:set时关闭严格模式
调用顶层set方法时传入strict: false参数,强制Mongoose跳过路径检查,直接赋值:
user.set(`users.jose.holding.itc`, 1000, { strict: false }); // 验证修改 console.log(user.get('users.jose.holding.itc')); // 输出1000 await user.save();
方法3:直接调用数据库更新方法
如果不需要先查询出文档实例,可以直接用updateOne等方法更新,数据库层面的更新可以直接识别嵌套Map的路径:
await UserModel.updateOne( // 此处替换为你的实际查询条件 { _id: '你的文档ID' }, { $set: { 'users.jose.holding.itc': 1000 } } );
内容的提问来源于stack exchange,提问作者ArunJose
相关产品推荐
相关产品推荐

