mongoose多条件查询包含不存在字段仍返回文档如何解决
问题原因
- 根因是你使用的Mongoose 6.x版本默认开启了
strictQuery配置,该配置会自动过滤查询条件中没有在对应集合Schema中声明的字段。 - 你的User Schema没有定义
tag字段,因此tag: "mockTag"的查询条件在发送到MongoDB之前就被Mongoose移除,实际执行的查询只有{email: "mockEmail"},所以返回了匹配email的第一条记录。你在mongoplayground运行的是原生MongoDB查询,没有这层过滤逻辑,因此结果符合预期。
解决方法
有三种可选方案,按需选择即可:
- 临时关闭单次查询的strict校验:在查询链上添加配置,只对本次查询生效
await User.find({email:"mockEmail",tag:"mockTag"}).setOptions({ strictQuery: false }).exec();
- 全局关闭strictQuery配置:在Mongoose连接初始化代码后添加全局配置,对所有查询生效
// 初始化连接后加入这行 mongoose.set('strictQuery', false);
- 补全Schema字段定义:如果
tag是业务需要的合法字段,直接在User Schema中补充字段定义即可
const userSchema = new mongoose.Schema({ // 原有其他字段 email: String, tag: String, // 新增tag字段定义 updatedAt: Date })
验证方法
你可以通过getFilter()方法打印Mongoose实际生成的查询条件,确认过滤逻辑是否生效:
const query = User.find({email:"mockEmail",tag:"mockTag"}); console.log(query.getFilter()); // 未修复前只会输出{email:"mockEmail"}
内容的提问来源于stack exchange,提问作者xiaokeliu666
相关产品推荐
相关产品推荐

