我在 MongoDB 数据库中将 Number 作为整数保存为整数时遇到了麻烦(当它应该是浮点数/双精度数时),因此我们改用十进制 128,现在它写得很好,但是当我尝试读回响应时返回为“new Decimal128("1.2") 而不是 1.3。
Rev 是我尝试从 Flutter 保存到数据库并读回的数字。
Mongo DB 结果有:
rev 1.3
starRating 3
dateCreated 1708412344794
架构:
const { Types, model, Schema } = require('mongoose');
const InfoSchema = new Schema({
id: String,
rev: {
type: Types.Decimal128
},
starRating: {
type: Types.Decimal128
},
控制台.log:
description: 'test',
rev: new Decimal128("1.3"),
starRating: new Decimal128("3"),
dateCreated: 1708412344794,
我要么需要找到一种方法来安全地写入和读取浮点/双精度数据类型,要么找出新的 Decimal128() 被附加的原因和方式,以及在哪里/如何删除它。
问题在于 BSON 和 javascript 之间的数据类型不匹配。
在 javascript 中,所有数字都存储为 64 位浮点数。显示时,如果可能,JavaScript 会自动修剪小数点和尾随零。
BSON (https://bsonspec.org/spec.html)有int32、uint64、int64、double和decimal128。
当存储包含数字的文档时,猫鼬和/或驱动程序必须猜测您是否打算使用“int”类型之一。阅读文档时,必须将其转换为javascript Number类型。
使用 mongoose 从数据库读取时,int 和 float 都会转换为 Number,因此在客户端,float 和 int 没有区别。
由于十进制 128 使用 128 位,因此没有自动过程将其截断为 64 位以适合数字。
您可以考虑使用 mongoose 插件,例如 double https://www.npmjs.com/package/@mongoosejs/double。