mongodb Mongoose 不能储存两种类型?

8fq7wneg  于 2022-11-03  发布在  Go
关注(0)|答案(3)|浏览(220)

我尝试在mongodb中存储double BSON类型。我正在使用mongoose。我尝试了所有可能的方法,但它仍然存储为int。我尝试了@mongoosejs/double和mongoose-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

3bygqnnd

3bygqnnd1#

我相信没有Double这样的类型。JavaScript有Number,它支持int,float,double等。另外,如果你看mongoose文档,你会发现Double不是一个有效的类型。相反,你应该使用Number

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

编辑:经过评论中的讨论,我相信这可以是一个变通办法。

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

在数据库中,price是double类型,但值是5.0005。因此,无论何时使用price的值,都可以将其设置为int,或者使用.toFixed(2)或类似函数将小数点限制为两位。

a6b3iqyw

a6b3iqyw2#

如果mongoose自定义类型不起作用,我可以使用原始的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
xxslljrj

xxslljrj3#

另一个有效的解决方案是:

const mongoose = require('mongoose');

const setter = (value: any) => {
    const result = mongoose.Types.Decimal128.fromString(parseFloat(value).toFixed(2));
    result._bsontype = 'Double'; // solution
    return result;
};

const Double = new mongoose.Schema(
    {
        anyDoubleValue: {
            type: mongoose.SchemaTypes.Mixed,
            set: setter
        }
    },
    {
        collection: 'double'
    }
);

export = mongoose.model('DoubleModel', Double);

您可以手动将_bsonType属性更改为Double

相关问题