Mongoose 6及以上版本使用metadata.source条件无法访问数组元素问题
查询失效原因分析
- 默认
strictQuery配置变更
Mongoose 6.x版本将strictQuery配置项的默认值从false调整为true。该配置开启时,Mongoose会自动过滤掉查询条件中未在Schema中显式定义的字段。如果你的Schema没有明确定义metadata.source这个嵌套数组路径,你写的metadata.source相关查询条件会被直接剔除,不会发送到MongoDB服务端执行,最终返回空结果。
你可以通过临时关闭该配置验证问题:
这也能解释为什么相同的查询条件可以在MongoDB Compass(直接发送原生MongoDB查询,不受Mongoose配置限制)和6以下版本Mongoose中正常运行。mongoose.set('strictQuery', false); - 多层嵌套数组的查询解析逻辑变更
即使你的Schema中已经完整定义了metadata数组及其内部source字段的结构,Mongoose 6对多层嵌套数组的点符号查询解析逻辑也做了调整。你使用的"metadata.source": {$exists: true, $not: {$size: 0}}在原生MongoDB中的语义是「只要metadata数组中至少有一个元素的source字段存在且长度不为0就匹配文档」,但Mongoose 6处理$not+$size的组合条件时,会错误地将条件作用范围解析到外层metadata数组,或是要求所有metadata元素的source都满足条件,导致匹配失效。
使用$elemMatch的查询方式可以规避这个解析问题,因为$elemMatch会明确告诉Mongoose条件是作用在metadata数组的单个元素上,不会出现作用范围解析错误的问题。
内容的提问来源于stack exchange,提问作者Happy_Sweetice
相关产品推荐
相关产品推荐

