programing

node.js에 대한 10진수 / mongoose 내 부동 소수점

minimums 2023. 5. 3. 20:54
반응형

node.js에 대한 10진수 / mongoose 내 부동 소수점

저는 node.js / mongoDB / mongoose에서 첫 번째 테스트 앱을 시작합니다. 이것은 DB에 레코드를 만들고 검색하는 것을 목표로 하는 매우 간단한 앱입니다.

다음과 같은 모델을 만듭니다.

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

정수 값 대신 속도에 대한 float 값을 제공할 수 있다는 점을 제외하고는 잘 작동합니다.Decimal과 Float을 시도해 보았지만 작동하지 않습니다.저도 서류에서 찾지 못했습니다.

감 잡히는 게 없어요?

제가 조금 검색해보니 플로트 값을 저장하려면 사용해야 한다는 내용의 이 기사가 있습니다.Numbertype. 임의의 float 값을 저장할 수 있습니다.speed들판.

예, 사용할 수 있습니다.Decimal128유형.

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

Mongoose 스키마에서 Decimal128을 다음과 같이 사용할 수 있습니다.

speed:{
type:mongoose.Types.Decimal128
}

사용자 지정 항목을 만들 수 있습니다.이와 같이

'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에서 복사되었습니다.

mongoDB는 float 유형을 완전히 지원하는 반면, mongoose는 정수인 Number 유형만 지원합니다.mongoose 유형의 Number를 사용하여 mongoDB float 번호에 저장하려고 하면 문자열로 변환됩니다.

이 문제를 해결하려면 값 유형을 확장할 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 
    }
});

도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/5605551/decimal-float-in-mongoose-for-node-js

반응형