Mongodb node.js的mongoose中的十进制/浮点
我在node.js/mongoDB/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 } }); 这是工作良好,除了我想能够提供一个浮点值的速度,而不是整数。我尝试过十进制和浮点运算,但都
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