node.js 的 mongoose 中的十进制/浮点数

Posted

技术标签:

【中文标题】node.js 的 mongoose 中的十进制/浮点数【英文标题】:Decimal / Float in mongoose for node.js 【发布时间】:2011-08-02 02:38:38 【问题描述】:

我在 node.js / mongoDB / mongoose 上启动了我的第一个测试应用程序,这是一个非常简单的应用程序,旨在在 DB 中创建记录并检索它们。

我创建了一个类似的模型:

var Car = new Schema(
    brand : String,
    speed  : Number,
    date  :   type: Date, default: Date.now 
);

这很好,除了我希望能够为速度提供一个浮点值而不是整数值。我尝试了 Decimal 和 Float,但它们都不起作用。 我也没有在文档中找到。

有什么想法吗?

【问题讨论】:

var car = new Car(brand: "", speed: 0.5); 【参考方案1】:

我已经搜索了一些 found this article stating that 来存储浮点值,您必须使用 Number 类型。您可以在speed 字段中存储任何浮点值。

【讨论】:

非常感谢。但是,在这篇文章中,似乎更多的是相反的方式,即将浮点数强制转换为整数,对吗?抱歉,我可能误解了这件事。 @Luc:没错,在关于将浮点数强制转换为整数的文章中。但这意味着您可以将浮点值存储在类型为Number 的字段中。所以Number 类型应该用于两种类型:整数和浮点数。 @Bugain13,非常感谢,你说得对。我应该做一些奇怪的事情,因为它一开始就不起作用。非常感谢您的帮助!!!! 您应该被警告:当使用数字和聚合(如对 Mongoose 求和)时,您会遇到 Ulps 问题。 (在点后面的几十个零之后插入一个 1) 它只是将浮点数转换为整数。没有别的【参考方案2】:

是的,您可以使用 Decimal128 类型。

https://mongoosejs.com/docs/api.html#mongoose_Mongoose-Decimal128

【讨论】:

【参考方案3】:

您可以创建自己的自定义。像这样

'use strict';

const mongoose = require('mongoose');

class DoubleType extends Number 
  constructor(v) 
    super(v);
    this.value = v;
    this._bsontype = 'Double';
  

  toBSON() 
    return this;
  


class Double extends mongoose.SchemaType 
  constructor(key, options) 
    super(key, options, 'Double');

    Object.assign(this.$conditionalHandlers, 
      '$lt': val => this.castForQuery(val),
      '$lte': val => this.castForQuery(val),
      '$gt': val => this.castForQuery(val),
      '$gte': val => this.castForQuery(val),
    );
  

  cast(val) 
    if (val == null) 
      return val;
    
    if (val._bsontype === 'Double') 
      return new DoubleType(val.value);
    

    const _val = Number(val);
    if (isNaN(_val)) 
      throw new mongoose.SchemaType.CastError('Double',
        val + ' is not a valid double');
    
    return new DoubleType(_val);
  


mongoose.Schema.Types.Double = Double;
mongoose.Types.Double = DoubleType;

module.exports = Double;

来源复制自@mongoosejs/double

【讨论】:

Como faria o uso? @EzequielTavares 哇【参考方案4】:

您可以在 Mongoose Schema 中使用 Decimal128 作为

speed:
type:mongoose.Types.Decimal128


【讨论】:

【参考方案5】:

虽然 mongoDB 完全支持浮点类型,但 mongoose 只支持整数类型的 Number。如果您尝试使用 mongooses 类型的 Number 保存到 mongoDB 浮点数,它将被转换为字符串。

要解决这个问题,您需要为 mongoose 加载一些插件,该插件将扩展其值类型。有一些插件最适合货币或日期,但在你的情况下,我会使用https://www.npmjs.com/package/mongoose-double。

更改后的模型如下所示:

var mongoose = require('mongoose')
require('mongoose-double')(mongoose);

var SchemaTypes = mongoose.Schema.Types;
var Car = new Schema(
    brand:  
        type: String 
    ,
    speed: 
        type: SchemaTypes.Double
    ,
    date: 
        type: Date, 
        default: Date.now 
    
);

希望对你有帮助。

【讨论】:

不,不会的。您可以将 25.50 等数字存储为数字,而不会存储为字符串

以上是关于node.js 的 mongoose 中的十进制/浮点数的主要内容,如果未能解决你的问题,请参考以下文章

单个node.js项目中的Mongoose和多个数据库

单个node.js项目中的Mongoose和多个数据库

Mongoose - 更新数组中的每个子文档(node.js)

Mongoose - 更新数组中的每个子文档(node.js)

Node.js/mongoose - 数组中的子文档不会删除/移除

Node.js/mongoose - 数组中的子文档不会删除/移除