Mongodb 猫鼬不能储存双重类型?
我试图在mongodb中存储双BSON类型。我在用猫鼬。我已经尝试了所有可能的方法,但它仍然存储为int。 我试过@mongoosejs/double和mongoose float,但都不起作用Mongodb 猫鼬不能储存双重类型?,mongodb,mongoose,Mongodb,Mongoose,我试图在mongodb中存储双BSON类型。我在用猫鼬。我已经尝试了所有可能的方法,但它仍然存储为int。 我试过@mongoosejs/double和mongoose float,但都不起作用 await Variant.insertOne( { price: 345, discount: 10, }, ) 产品模型 import { Schema } from "mongoose" const Doub
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我相信没有Double这样的类型。JavaScript有支持int、float、double等的数字。此外,如果您看到mongoose文档,您将看到double不是有效的类型。相反,您应该使用数字 编辑:在评论中讨论后,我相信这是一个解决办法
const price = 5;
await Model.create({
price: price * 1.0001,
...
});
在数据库中,价格为双精度类型,但值为5.0005。因此,只要您想使用price的值,就可以使用int或.toFixed2或类似函数将小数点限制为2位。好的,如果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
mongoose本身没有,但我们可以使用插件来创建一个自定义插件。例如@mongoosejs/double,我理解。但目的是什么?在js中,你不需要打字。你可以对任何数字类型进行算术运算,不管它的十进制值是多少。prisma的返回类型是float,但存储的值是int,它会抛出一个错误。所以我应该把价格存储为double@Ehsansarshar我已经更新了我的答案。这可能不是一个完美的解决方案,但它应该是可行的。tnx。但这仍然是一个问题,我希望这能得到解决。因为我已经添加了自定义类型,但不知道为什么不工作为什么说值存储为int?@D.SM是的,如果int存储为int,如果十进制存储为double。但是我想存储为double,不管它是十进制还是非十进制。您有什么证据表明这没有发生?db.Variant.find{price:{$type:double}返回null db.Variant.find{price:{$type:int}返回值
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