You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:41:33