MongoDB(Mongoose):如何向嵌套文档数组推送对象?
解决MongoDB数组元素追加(不存在则创建数组)的问题
你的问题出在更新操作的语法和结构错误上,原代码没有正确使用MongoDB的$push操作符,导致数组处理异常。
错误原因分析
原代码中你直接对therapy_records对象进行赋值,并且$push的用法完全错误——$push需要接收一个键值对,键是目标数组的路径,值是要追加的元素,而不是直接传数组。这种写法会覆盖原有数据,或者生成不符合预期的空对象。
正确实现方式
MongoDB的$push操作符本身就支持数组存在则追加元素,不存在则创建数组并添加的逻辑,不需要额外判断。你只需要通过点符号路径精准定位到therapy_records.daily_record数组,然后用$push追加元素即可。
正确代码示例:
const user = await User.findByIdAndUpdate( userId, { $push: { "therapy_records.daily_record": { therapy_day: anyNumber, date: anyDate, consumed: anyNumber, limit: anyNumber, goal: anyNumber, morning_timer: anyNumber } } }, { new: true, upsert: true } );
关键说明
- 使用
"therapy_records.daily_record"这种点路径,精准指向嵌套在therapy_records下的daily_record数组。 $push操作符会自动处理数组的存在性:如果该字段不存在,会先创建一个数组,再把元素添加进去;如果数组已存在,直接追加新元素。- 保留
new: true确保返回更新后的用户文档,upsert: true仅在你需要当用户ID不存在时自动创建新用户的场景下使用,如果不需要创建新用户,可以去掉这个选项。
内容的提问来源于stack exchange,提问作者Carlos del Río Francés
相关产品推荐
相关产品推荐

