Mongoose更新含数组文档异常,需同时更新字段与追加数组元素
Mongoose更新含数组的文档问题解决
问题
使用Mongoose更新包含数组的对象时未达预期,需要同时更新email、firstName、lastName字段,并向prices数组追加新对象。
原始文档
{ "email": "test@gmail.com", "firstName": "Test", "lastName": "T", "prices": [ { "date": "2022-08-24T07:29:01.639Z", "price": 45 } ] }
当前更新代码
const entity = await User.findByIdAndUpdate(id, request.payload, { new: true, runValidators: true, context: "query", }).exec();
期望更新后的文档
{ "email": "test@gmail.com", "firstName": "Test", "lastName": "T", "prices": [ { "date": "2022-08-24T07:29:01.639Z", "price": 45 }, { "date": "2022-07-24T09:29:01.639Z", "price": 55 } ] }
解决方法
直接传递request.payload会替换整个prices数组,而非追加元素。需要使用MongoDB的更新操作符分别处理普通字段和数组:
- 用
$set更新普通字段(email、firstName、lastName) - 用
$push向prices数组追加新对象
修改后的代码如下:
// 假设request.payload包含email、firstName、lastName,以及要追加的新price对象(如request.payload.newPrice) const updateData = { $set: { email: request.payload.email, firstName: request.payload.firstName, lastName: request.payload.lastName }, $push: { prices: request.payload.newPrice // 传入要追加的新price对象 } }; const entity = await User.findByIdAndUpdate(id, updateData, { new: true, runValidators: true, context: "query" }).exec();
关键说明
$set:精准更新指定字段,不会改动其他未提及的字段$push:向数组末尾添加单个元素,若需批量添加可搭配$each使用- 保留
new: true确保返回更新后的最新文档,runValidators: true保证更新时触发Schema验证规则
内容的提问来源于stack exchange,提问作者Aravinth E
相关产品推荐
相关产品推荐

