Mongoose中如何使用$push向指定attachments数组字段插入新值
正确实现方案
你现有写法的问题
- 查询条件使用
projectId会匹配该项目下的所有任务,若你需要更新单个指定任务,需替换为任务ID作为查询条件;若确实需要批量更新同项目所有任务,需要将updateOne改为updateMany,否则仅会更新匹配到的第一个任务。 - 缺少
await关键字,异步操作不会等待执行完成,可能出现逻辑异常。 - 若传入的
attachments是多个附件组成的数组,直接写$push: { attachments: attachments }会把整个数组作为单个元素插入,不符合预期,需要配合$each操作符使用。
正确实现方式
方式1:直接使用updateOne/updateMany操作
场景1:更新单个指定任务,插入单个附件
// 以路由参数传入的task id作为查询条件,仅匹配目标任务 await taskModel.updateOne( { _id: req.params.id }, { $push: { attachments: attachments } } // attachments为单个附件对象 );
场景2:更新单个指定任务,批量插入多个附件
await taskModel.updateOne( { _id: req.params.id }, { $push: { attachments: { $each: attachments } } } // 用$each遍历附件数组逐个插入 );
场景3:批量更新同项目下所有任务,插入附件
await taskModel.updateMany( { projectId: projectId }, { $push: { attachments: { $each: attachments } } } // 单个附件可以去掉$each直接传对象 );
方式2:结合你现有findById+save的逻辑修改
不需要额外调用update方法,直接操作查询到的task实例的数组字段再保存即可:
export const updateTaskById = async (req, res) => { try { const { projectId, attachments, invitedPeopleId } = req.body; const task = await taskModel.findById(req.params.id); if (task) { // 原有逻辑 task.invitedPeopleId = invitedPeopleId || task.invitedPeopleId; // 插入附件:单个附件直接push task.attachments.push(attachments); // 若为多个附件,改用展开运算符: // task.attachments.push(...attachments); await task.save({ validateBeforeSave: false, }); // 补充返回响应 return res.status(200).json({ code: 200, msg: '更新成功', data: task }); } return res.status(404).json({ code: 404, msg: '未找到对应任务' }); } catch (error) { console.log(error.message); return res.status(500).json({ code: 500, msg: '更新失败', error: error.message }); } };
内容的提问来源于stack exchange,提问作者rSeeker
相关产品推荐
相关产品推荐

