71 votes

Decimal / Float dans mongoose pour node.js

Je commence ma première application de test sur node.js / mongoDB / mongoose, il s'agit d'une application très simple qui vise à créer des enregistrements dans la base de données et de les récupérer.

Je crée un modèle comme :

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

Cela fonctionne bien, sauf que j'aimerais pouvoir fournir une valeur flottante pour la vitesse au lieu de la valeur entière. J'ai essayé les valeurs Decimal et Float, mais aucune ne fonctionne. Je n'ai pas non plus trouvé dans la documentation.

Une idée ?

1 votes

var car = new Car({brand: "", speed: 0.5});

99voto

Andrew Orsich Points 24503

J'ai cherché un peu et J'ai trouvé cet article qui affirme que pour stocker des valeurs flottantes, vous devez utiliser Number type. Vous pouvez stocker n'importe quelle valeur flottante dans speed champ.

1 votes

Merci beaucoup. Mais, dans cet article, il semble que ce soit plutôt l'inverse, c'est-à-dire forcer un flottant à devenir un entier, non ? Désolé, j'ai peut-être mal compris la chose.

4 votes

@Luc : Exactement, dans l'article sur le fait de forcer un float dans un integer. Mais cela signifie que vous pouvez stocker une valeur flottante dans un champ de type Number . Donc Number doit être utilisé pour les deux types : integer et float.

1 votes

@Bugain13, merci beaucoup, vous avez raison. Il y a quelque chose d'étrange que j'aurais dû faire car cela ne fonctionnait pas au départ. Merci beaucoup pour votre aide ! !!!

11voto

Pranab Das Points 19

Vous pouvez utiliser le Décimal128 dans Mongoose Schema comme

speed:{
type:mongoose.Types.Decimal128
}

10voto

Oui, vous pouvez utiliser le Decimal128 type.

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

2voto

Ehsan sarshar Points 112

Vous pouvez en créer un personnalisé, comme suit

'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;

la source est copiée de @mongoosejs/double

0 votes

Como faria o uso ?

0 votes

@EzequielTavares waa

-4voto

shamanSK Points 450

Alors que la base de données Mongo prend entièrement en charge le type float, la mangouste ne prend en charge que le type Number, qui est un nombre entier. Si vous essayez d'enregistrer dans la base de données mongo un nombre flottant en utilisant le type de nombre de la mangouste, il sera converti en chaîne de caractères.

Pour résoudre ce problème, vous devrez charger un plugin pour Mongoose qui étendra ses types de valeurs. Certains plugins fonctionnent mieux avec les monnaies ou les dates, mais dans votre cas, j'utiliserais plutôt https://www.npmjs.com/package/mongoose-double .

Votre modèle après modifications ressemblerait à quelque chose comme ceci :

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

J'espère que cela vous aidera.

7 votes

Non, pas du tout. Vous pouvez stocker des nombres comme 25,50 comme un nombre et il ne sera pas stocké comme une chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X