Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb node.js的mongoose中的十进制/浮点_Mongodb_Node.js_Mongoose - Fatal编程技术网

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

Mongodb node.js的mongoose中的十进制/浮点,mongodb,node.js,mongoose,Mongodb,Node.js,Mongoose,我在node.js/mongoDB/mongoose上启动了我的第一个测试应用程序,这是一个非常简单的应用程序,旨在将记录打包到数据库中并检索它们 我创建了一个模型,如下所示: var Car = new Schema({ brand : String, speed : Number, date : { type: Date, default: Date.now } }); 这是工作良好,除了我想能够提供一个浮点值的速度,而不是整数。我尝试过十进制和浮点运算,但都

我在node.js/mongoDB/mongoose上启动了我的第一个测试应用程序,这是一个非常简单的应用程序,旨在将记录打包到数据库中并检索它们

我创建了一个模型,如下所示:

var Car = new Schema({
    brand : String,
    speed  : Number,
    date  :  { type: Date, default: Date.now }
});
这是工作良好,除了我想能够提供一个浮点值的速度,而不是整数。我尝试过十进制和浮点运算,但都不起作用。 我也没有在文档中找到


有什么想法吗?

我搜索了一些,为了存储浮点值,必须使用
Number
type。您可以在
speed
字段中存储任何浮点值。

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

为了解决这个问题,您需要为mongoose加载一些插件,这将扩展其值类型。有一些插件最适合货币或日期,但在你的情况下,我会使用

更改后的模型将如下所示:

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 
    }
});

希望有帮助。

是的,您可以使用
小数128
类型


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

'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复制的

非常感谢。但是,在本文中,它似乎更像是相反的方式,即强制浮点变成整数,对吗?对不起,我可能弄错了。@Luc:没错,在关于强制浮点变成整数的文章中。但这意味着您可以在类型为
Number
的字段中存储浮点值。所以
Number
type应该同时用于两种类型:整数和浮点。@Bugain13,非常感谢,你是对的。有些奇怪的事情我应该做,因为它一开始就不起作用。非常感谢你的帮助!!!!您应该得到警告:当使用数字和聚合(如Mongoose的求和)时,您将遇到Ulps问题。(在点后面几十个零后插入1)它只是将float转换为int,没有其他任何东西
var car=新车({brand:,speed:0.5})不,不会。您可以将25.50这样的数字存储为一个数字,而不会存储为stringComo faria o uso?@EzequielTavares waa