You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:03:13