Mongoose查询子文档数组匹配ObjectId后更新对应attended字段的实现方法
解决方案
你当前的代码存在两个核心问题:
findByIdAndUpdate是基于Event文档的主键_id查询,而你传入的req.body.guest是guests子数组内的子文档_id,无法匹配到对应的Event文档- 直接写
guests.attended无法定位到数组内的具体元素,需要用到MongoDB的位置$操作符自动匹配查询条件命中的数组元素索引
实现逻辑
- 查询条件配置为匹配
guests._id等于传入的guest子文档ID,找到对应的父Event文档 - 更新时用
guests.$.attended指向命中的guest元素的attended字段,直接赋值为Y - 如果需要返回更新后的最新文档,可以添加
new: true配置项
修改后的代码
module.exports.checkIn = async(req, res) => { try { const updatedEvent = await Event.findOneAndUpdate( // 查询条件:匹配guests数组中_id等于传入的guest ID的文档 { "guests._id": req.body.guest }, // $ 自动匹配查询条件命中的数组元素下标,更新对应元素的attended字段 { $set: { "guests.$.attended": "Y" } }, // 可选配置:返回更新后的最新文档,默认返回更新前的旧文档 { new: true } ); res.send(updatedEvent); } catch (err) { res.send(err); } };
补充说明
如果你的业务场景中,一个guest子文档ID可能对应多个Event文档,需要批量更新所有匹配的guest签到状态,可以把findOneAndUpdate换成updateMany,其他参数保持不变即可。
内容的提问来源于stack exchange,提问作者econobro
相关产品推荐
相关产品推荐

