Mongoose 6.012中Model.find携带过滤条件仍返回全部文档如何解决?
Mongoose非_id字段查询返回全部文档排查方案
- 检查Schema字段定义
Mongoose默认会过滤不在Schema声明范围内的查询条件,你当前示例Schema仅声明了name字段,如果需要使用anotherField作为查询条件,需要先在Schema中补充该字段定义:
const XXXSchema = new mongoose.Schema({ name: String, anotherField: String // 补充查询用到的字段,类型和实际存储一致即可 })- 检查Schema字段定义
- 调整strictQuery配置
如果业务场景需要查询Schema未提前定义的字段,可以修改strictQuery配置关闭字段过滤:
全局配置:
单模型配置:// 全局关闭所有模型的strictQuery校验 mongoose.set('strictQuery', false)const XXXSchema = new mongoose.Schema({ name: String }, { strictQuery: false }) // 仅当前模型关闭strictQuery校验- 调整strictQuery配置
- 排查查询中间件逻辑
检查是否为对应Schema定义了pre('find')/pre('findOne')等前置中间件,是否存在中间件误修改查询过滤条件的情况,可以添加临时日志确认:
XXXSchema.pre('find', function(next) { console.log('当前查询过滤条件:', this.getFilter()) next() })- 排查查询中间件逻辑
- 确认模型绑定正确性
检查MyModel的定义是否正确绑定了目标Schema,没有误用其他空Schema或者错误Schema:
// 第二个参数必须为你定义的XXXSchema const MyModel = mongoose.model('MyModel', XXXSchema)- 确认模型绑定正确性
- 原生驱动验证排除数据库层问题
可以直接调用MongoDB原生驱动执行查询,排除数据库本身的问题,如果原生查询返回结果正常,则可以确认问题出在Mongoose配置层:
const collection = mongoose.connection.collection('你的集合实际名称') const result = await collection.find({anotherField: "some value"}).toArray()- 原生驱动验证排除数据库层问题
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

