使用Mongoose调用MongoDB find()无法按provider字符串字段过滤
Mongoose按自定义provider字段过滤失效问题
我用Mongoose从MongoDB数据库检索数据时,发现按date字段过滤可以正常返回结果,但按自定义的provider字段过滤时,无论查询值是什么,都会返回所有存储的元素——实际上没有任何数据的provider值是"example",部分数据甚至没有provider字段。
正常运行的date过滤代码
const logs = await ActionLog.find({ date:{ $gt: initialDate, $lt: finishDate}}); if(logs.length == 0){ res.status(204); res.json({message:"No matches for this search"}); }else res.send(logs);
失效的provider过滤代码
const logs = await ActionLog.find({ provider:"example" } );
数据库数据示例
[ { "_id": "6374768bd302cd09838d4c67", "module": "event approval", "date": "2022-11-16T05:35:07.252Z", "__v": 0 }, { "_id": "637476aad302cd09838d4c69", "module": "event update", "date": "2022-11-16T05:35:38.798Z", "__v": 0 }, { "_id": "6374768bd302cd09838d4c11", "module": "sale", "provider": "prueba", "date": "2022-11-20T05:35:07.252Z", "__v": 0 } ]
排查与解决方法
- 检查Schema定义:这是最常见的原因——如果
ActionLog的Mongoose Schema中没有声明provider字段,Mongoose的默认行为可能会忽略这个查询条件。需要在Schema中添加该字段:
const actionLogSchema = new mongoose.Schema({ module: String, date: Date, provider: { type: String, required: false } // 声明为可选字符串字段 }); const ActionLog = mongoose.model('ActionLog', actionLogSchema);
验证字段类型匹配:确认Schema中
provider的字段类型和数据库中存储的类型一致(比如都是字符串),类型不匹配会导致查询失效。用原生驱动测试查询:绕过Mongoose直接用MongoDB原生驱动执行查询,排查是否是Mongoose的问题:
const db = mongoose.connection.db; const logs = await db.collection('actionlogs').find({ provider: "example" }).toArray(); console.log(logs); // 正常应该返回空数组
如果原生查询返回空,说明问题出在Mongoose的Schema配置上;如果原生查询也返回所有数据,需要检查数据库数据是否存在隐性问题(比如字段名大小写不一致)。
内容的提问来源于stack exchange,提问作者Lorenzo Boga
相关产品推荐
相关产品推荐

