Mongoose读写MongoDB浮点数异常:Decimal128返回格式问题求助
解决Mongoose读写MongoDB浮点数的问题
方法一:转换Decimal128实例为纯数值
读取文档时,可通过Schema配置或手动处理,把Decimal128实例转为普通数值:
1. Schema中配置自动转换的getter
在字段定义里添加getter函数,同时开启toObject/toJSON的getter生效开关:
const yourSchema = new mongoose.Schema({ rev: { type: mongoose.Types.Decimal128, get: (val) => val ? parseFloat(val.toString()) : val }, starRating: { type: mongoose.Types.Decimal128, get: (val) => val ? parseFloat(val.toString()) : val } }); // 确保getter在转换为普通对象/JSON时生效 yourSchema.set('toObject', { getters: true }); yourSchema.set('toJSON', { getters: true });
2. 查询后手动转换字段
如果不想修改Schema,查询到文档后直接处理:
const doc = await YourModel.findById(docId); const plainData = doc.toObject(); plainData.rev = parseFloat(plainData.rev.toString()); plainData.starRating = parseFloat(plainData.starRating.toString()); console.log(plainData.rev); // 输出1.3
方法二:正确使用Number类型存储浮点数
之前Number类型存浮点数变整数,大概率是配置或写入数据类型的问题,可按以下方式修正:
1. 修正Schema与写入逻辑
确保Schema字段无整数限制,写入时传入正确的浮点数类型:
const yourSchema = new mongoose.Schema({ rev: Number, starRating: Number }); // 写入时直接传浮点数 await YourModel.create({ rev: 1.3, starRating: 3 });
同时检查Flutter端写入逻辑,确保发送的是double类型而非整数或字符串。
2. 使用Mongoose封装的Decimal类型
Mongoose提供的mongoose.Decimal是Decimal128的封装,读取时自动返回数值:
const yourSchema = new mongoose.Schema({ rev: mongoose.Decimal, starRating: mongoose.Decimal });
该类型既保证精度,又无需手动转换实例。
方法三:规范Flutter端写入数据格式
Flutter端写入时,确保rev和starRating字段用double类型传递,避免将数值转为字符串或整数后存入,这样MongoDB会直接识别为浮点数,Mongoose读取时可直接获取纯数值。
内容的提问来源于stack exchange,提问作者KatieK
相关产品推荐
相关产品推荐

