пн goose не может хранить двойные типы? - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь сохранить двойной тип BSON внутри mongodb. Я использую mon goose. Я пробовал все возможные способы, но все же он хранится как int. Я пробовал @ mongoosejs / double и mon goose -float, но ни один из них не работает.

await Variant.insertOne(
    
    {
          price: 345,
          discount: 10,
     },
)

модель продукта

import { Schema } from "mongoose"
const Double = require("@mongoosejs/double")

// const Float = require("mongoose-float").loadType(mongoose)
export const ProductVariantEmbeddedSchema = new Schema({
  price: Double,
  discount: Double,
})

вот настраиваемый тип, который я создал помощь @ mongoosejs / double.

import mongoose from "mongoose"

export default function mongooseDouble(mongoose) {
  class DoubleType extends Number {
    constructor(v) {
      super(v)
      this.value = v
    }

    toBSON() {
      return this.value
    }
  }

  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
      }

      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

  return mongoose
}

// экспорт по умолчанию Double

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Я считаю, что такого типа как Double не существует. JavaScript имеет Number, который поддерживает int, float, double, et c. Кроме того, если вы видите документацию mon goose, вы увидите, что Double не является допустимым типом. Вместо этого вы должны использовать Number.

const ProductVariantEmbeddedSchema = new Schema({
  price: Number,
  discount: Number,
});

EDIT: после обсуждения в комментарии я считаю, что это может быть обходным путем.

const price = 5;
await Model.create({
    price: price * 1.0001,
    ...
});

В базе данных цена будет тип double, но значение будет 5.0005. Итак, всякий раз, когда вы хотите использовать значение price, либо сделайте его int, либо используйте .toFixed(2) или аналогичную функцию, чтобы ограничить десятичную точку до 2 знаков.

0 голосов
/ 21 июня 2020

хорошо, кажется, что если mon goose нестандартные типы не работают, я могу использовать сырые запросы mongodb.

import mongoose, {mongo} from 'mongoose'

const result = await mongoose.connection.collection('Variant').insertMany([{price: new mongo.Double(34)}, {price: new mongo.Double(45)}]) 

const storedValues = result.opt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...