我尝试在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
3条答案
按热度按时间3bygqnnd1#
我相信没有
Double
这样的类型。JavaScript有Number
,它支持int,float,double等。另外,如果你看mongoose文档,你会发现Double
不是一个有效的类型。相反,你应该使用Number
。编辑:经过评论中的讨论,我相信这可以是一个变通办法。
在数据库中,price是double类型,但值是
5.0005
。因此,无论何时使用price
的值,都可以将其设置为int
,或者使用.toFixed(2)
或类似函数将小数点限制为两位。a6b3iqyw2#
如果mongoose自定义类型不起作用,我可以使用原始的mongodb查询。
xxslljrj3#
另一个有效的解决方案是:
您可以手动将_bsonType属性更改为
Double