从MongoDB查询distance字段返回null,请求技术协助
解决MongoDB查询返回null的问题
嘿,我来帮你搞定这个问题!从你的代码和描述来看,核心问题是字段类型不匹配,再加上Schema定义的小疏漏,咱们一步步梳理:
1. 最关键的问题:类型不匹配导致查不到数据
你在Schema里把distance定义成了String类型,但查询时用的是数字2887.2021794319153——MongoDB是严格的强类型匹配,字符串和数字完全是两种不同的类型,所以数据库找不到匹配的文档,自然返回null。
你得先确认iot集合里distance字段实际存的是什么类型:
- 如果数据库里存的是字符串,那查询条件要改成字符串形式:
{distance: "2887.2021794319153"} - 如果存的是数字(Number),那把Schema里的
distance类型改成Number,和存储类型保持一致
2. Schema定义的小问题
你的Schema写法不符合mongoose的规范:
- 要确保正确导入mongoose的
Schema构造函数(首字母大写,不是小写的schema) - 定义Schema的变量名建议更清晰,比如
IotSchema,方便后续维护
修改后的完整代码示例
const mongoose = require('mongoose'); const { Schema } = mongoose; // 正确导入Schema构造函数 mongoose.connect(db) .then(()=>{ console.log('connection done') }) .catch(err =>{ console.log(err) }) // 根据实际存储类型调整distance的类型,这里假设是Number const IotSchema = new Schema({ distance: { type: Number } }) const Per = mongoose.model('iot', IotSchema) // 传入正确的Schema实例 // 用匹配类型的条件查询 Per.findOne({distance: 2887.2021794319153}) .then(person=>{ console.log(person) }) .catch(err=>console.log(err))
额外排查小技巧
- 先在MongoDB Compass或者终端里手动跑一遍查询,确认数据是否真的存在:
db.iot.findOne({distance: 2887.2021794319153}) - 如果手动查询也找不到,可能是数据本身不存在,或者小数精度有差异(比如存储的数值和你查询的有细微差别)
内容的提问来源于stack exchange,提问作者Dhananjaya




