为何Mongoose会为查询结果自动新增Schema定义的属性?
Mongoose自动添加Schema默认值属性到查询结果的原因
Mongoose这么做核心是因为它的文档水合(hydration)机制——它会把MongoDB返回的原始BSON文档,转换成完全符合你定义的Schema结构的Mongoose文档对象,具体原因可以拆成这几点:
- Schema里的默认值是Mongoose层面的配置,不是直接存在数据库中的。当查询到数据库里没有该字段的文档时,Mongoose会自动把Schema定义的默认值补到返回的文档里,保证返回的结构和你约定的Schema完全一致,避免业务代码因为缺失字段出现
undefined相关的报错。 - 这种设计是为了降低开发者的心智负担:你可以完全基于Schema约定的结构写代码,不用额外判断某个字段是否存在。比如直接用
user.isAdmin,不管数据库里有没有这个字段,都能拿到确定的布尔值(比如你设置的默认false),不用额外处理null或undefined的情况。 - 但这也会和原生MongoDB查询产生差异:原生查询直接操作数据库里的BSON数据,缺失字段的文档并不等于
isAdmin: false,所以用db.users.find({ isAdmin: false })查不到这些文档,得用{ isAdmin: { $in: [null, undefined] } }或者{ isAdmin: { $exists: false } }才能匹配。
如果不想让Mongoose自动填充默认值,查询时可以加lean()方法,这样返回的是原始JS对象,不会经过Schema的水合处理,就不会出现额外字段了:
User.find().lean()
内容的提问来源于stack exchange,提问作者kal_stackO
相关产品推荐
相关产品推荐

