Mongoose 从 1.2 的 MongoDB 读取新的 Decimal128('1.2')

问题描述 投票:0回答:1

我在 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() 被附加的原因和方式,以及在哪里/如何删除它。

json mongodb flutter mongoose
1个回答
0
投票

问题在于 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

© www.soinside.com 2019 - 2024. All rights reserved.