如何在mongoose中将整数类型值存储为Double类型
解决方案
你可以通过强制将数值封装为MongoDB原生Double实例的方式,实现无论数值是否带有小数位,都统一以double格式存入数据库,彻底解决跨Java技术栈的类型匹配问题,具体实现如下:
步骤1:引入依赖
无需安装额外第三方包,直接使用Mongoose依赖中自带的MongoDB驱动内置Double类型即可(也可继续使用你之前安装的@mongoosejs/double模块,效果一致):
const { Double } = require('mongodb'); // 若使用@mongoosejs/double则引入方式为: // const Double = require('@mongoosejs/double');
步骤2:调整Schema配置
给对应数值字段添加set钩子,强制所有写入值封装为Double实例,避免Mongoose自动将无小数位的数值优化存储为int32:
const yourSchema = new mongoose.Schema({ // 其他字段配置... number: { type: Double, set: (value) => new Double(value) } })
方案说明
- 存储侧:所有写入该字段的数值,不管是整数
1、浮点数1.23还是0,都会严格以double格式存入MongoDB,Java侧读取时不会出现类型冲突问题 - 读取侧:
Double类型的数值读取到NodeJS环境时,会自动转换为原生Number类型,完全不影响现有业务逻辑的使用,兼容原有代码
你之前尝试的两种方案的问题根源:
- 仅使用
@mongoosejs/double未做强制转换时,Mongoose会默认对无小数位的数值做存储优化,自动转换为int32格式存储,所以才会出现存1时类型不匹配的问题 - 补零强制转小数的方案本身存在精度风险,
0被存储为1e-7会直接污染业务数值,完全不推荐使用
内容的提问来源于stack exchange,提问作者Chicky
相关产品推荐
相关产品推荐

