You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose select方法未按预期工作,无法包含select设为false的字段

异常原因

该问题是Mongoose更新类方法的默认行为导致的,核心有两点:

  1. findByIdAndUpdate 默认返回更新前的旧文档,未加new: true选项时,即使select规则生效,也可能因为返回的是旧数据产生未生效的误解。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:48:02