Mongoose中Long类型字段调用toNumber()无效,如何转为数字?
解决Mongoose Long类型字段转数字无效的问题
直接修改Mongoose文档的字段值不会生效,因为Mongoose文档是带有getter/setter的特殊对象,并非普通JavaScript对象。你可以通过以下几种方式实现createdBy字段转为数字格式:
方案1:查询时使用lean()转为普通对象
lean()会让Mongoose返回普通JS对象而非文档实例,此时可直接修改字段:
// 示例查询代码 const docs = await yourModel.find().lean(); docs.forEach(doc => { doc.createdBy = doc.createdBy.toNumber(); }); return { body: { docs }, header: { isSuccess: true, Code: 0 } };
方案2:使用文档的set()方法修改后转普通对象
如果已经拿到Mongoose文档实例,需要用set()方法修改字段,再通过toObject()转为普通对象:
for (let i = 0; i < query.docs.length; i++) { query.docs[i].set('createdBy', query.docs[i].createdBy.toNumber()); } // 转换为普通对象后返回 const result = { body: { docs: query.docs.map(doc => doc.toObject()) }, header: { isSuccess: true, Code: 0 } }; return result;
方案3:在Schema中配置全局转换(一劳永逸)
在Schema定义时添加toJSON和toObject的transform配置,让文档每次转为JSON或普通对象时自动转换createdBy:
const xSchema = new mongoose.Schema( { name: { type: String, required: true, trim: true, }, description: { type: String, required: true, trim: true, }, createdBy: { type: mongoose.SchemaTypes.Long, required: true, default: 0 } }, { // 转JSON时自动转换 toJSON: { transform: (doc, ret) => { ret.createdBy = ret.createdBy.toNumber(); } }, // 转普通对象时自动转换 toObject: { transform: (doc, ret) => { ret.createdBy = ret.createdBy.toNumber(); } } } );
这样无论你是直接返回文档实例,还是调用doc.toJSON()/doc.toObject(),createdBy都会自动转为数字格式。
内容的提问来源于stack exchange,提问作者noxoco4939
相关产品推荐
相关产品推荐

