MongoDB中如何阻止NaN自动转换为Null存储?
问题
我需要为部分JSON属性存储NaN值,但将其保存到MongoDB时,系统会自动将NaN转换为Null,请问如何阻止这一行为?
代码片段(MongoDB Model类)
import mongoose, { Schema } from "mongoose"; const prodSchema = new Schema({ productName: String, oppId: mongoose.Schema.Types.ObjectId, // 我在前端保存的是NaN类型,但数据库中被存为null isNaNOrNot: String, createdById: String, createdBy: String, }, { strict: false} ); export const Product = mongoose.model("Product", productSchema);
解决方案
MongoDB本身不原生支持NaN作为值存储,Mongoose默认会把NaN转换为null。要保留NaN的语义,你可以通过以下方式处理:
方式一:手动转换为字符串存储
既然你的isNaNOrNot字段定义为String类型,保存时把NaN转为字符串"NaN",读取时再转回NaN即可:// 保存数据时处理 const product = new Product({ // 其他字段... isNaNOrNot: isNaN(yourValue) ? "NaN" : yourValue }); await product.save(); // 读取数据时还原 const savedProduct = await Product.findById(productId); savedProduct.isNaNOrNot = savedProduct.isNaNOrNot === "NaN" ? NaN : savedProduct.isNaNOrNot;方式二:用Mongoose字段转换器自动处理
给字段添加set和get转换器,让Mongoose自动完成NaN与字符串的转换,无需手动处理:const prodSchema = new Schema({ // 其他字段... isNaNOrNot: { type: String, set: (value) => isNaN(value) ? "NaN" : value, get: (value) => value === "NaN" ? NaN : value } }, { strict: false });关键说明
MongoDB无法直接存储原始的NaN类型,必须通过转换为字符串、特殊数值(比如-Infinity)等MongoDB支持的类型来间接保留NaN的语义。如果选择用数值类型存储,要确保业务逻辑能区分标记值和正常数值,避免混淆。
内容的提问来源于stack exchange,提问作者SakthiSureshAnand
相关产品推荐
相关产品推荐

