Mongoose select方法未按预期工作,无法包含select设为false的字段
异常原因
该问题是Mongoose更新类方法的默认行为导致的,核心有两点:
findByIdAndUpdate默认返回更新前的旧文档,未加new: true选项时,即使select规则生效,也可能因为返回的是旧数据产生未生效的误解。- Mongoose的
findByIdAndUpdate、updateOne这类更新方法,链式调用的select()方法在部分版本中不会作用于返回的文档,Schema上的select: false规则仍然会生效,因为更新方法的查询投影和普通find方法的投影处理逻辑存在差异。
解决方案
调整调用方式,把字段选择规则和其他更新选项一起放到第三个参数中即可:
const user = await User.findByIdAndUpdate( req.params.id, { active_account: false }, { new: true, // 按需添加,开启后将返回更新后的新文档 projection: '+active_account' // 在此指定需要返回的select: false字段 } );
如果需要保留链式调用的写法,也可以分两步执行,先执行更新再单独查询数据,不过性能略低于上述写法:
await User.findByIdAndUpdate(req.params.id, { active_account: false }); const user = await User.findById(req.params.id).select('+active_account');
内容的提问来源于stack exchange,提问作者nothing special
相关产品推荐
相关产品推荐

