Mongoose中findById链式调用updateOne后未返回预期文档的原因
触发原因说明
这是Mongoose框架的正常API行为,核心原因如下:
- 不同类型操作的返回值规则不同
你调用findById()+populate()属于读查询操作,这类操作await后默认返回匹配到的文档对象。但追加updateOne()后,整个链式操作的性质变为写操作,MongoDB的写操作默认返回的就是你打印的操作统计结果,字段含义分别是匹配条数n、修改条数nModified、操作状态ok等,不会返回目标文档。 - 链式调用逻辑存在冗余
读查询阶段的populate('input')对后续的写操作完全无效,updateOne()会直接忽略读查询阶段的填充配置,等效于你直接执行了如下代码:const updateResult = await User.updateOne({ _id: req.user.id }, { formResponded: '1' });
修正方案
如果你需要在更新后拿到填充了关联字段的最新文档,建议使用findByIdAndUpdate方法,配置返回更新后文档的参数即可:
const user = await User.findByIdAndUpdate( req.user.id, { formResponded: '1' }, { new: true } // 配置项,指定返回更新后的文档,默认返回更新前的旧文档 ).populate('input');
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

