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

Mongoose查询结果_id带new ObjectId如何仅返回字符串哈希值

解决Mongoose查询返回_id为ObjectId对象的问题

出现该问题是因为Mongoose默认返回的查询结果是Mongoose文档实例,其中_id字段是ObjectId类型的实例对象,直接做JSON序列化时无法自动转为字符串,就会导致JSON响应异常。

方法1:查询时添加lean()(最常用)

lean()会让Mongoose直接返回普通JavaScript对象,而非Mongoose文档实例,_id会自动转为字符串格式,同时还能提升查询性能。
修改你的查询代码如下:

book_data = await Book.find({ slug: 'test' })
                        .where('status').equals('Active')
                        .select('title')
                        .lean() // 新增该行配置
                        .exec()

方法2:手动转换单个_id

如果只需要处理部分_id字段,直接调用ObjectId实例的toString()方法即可:

// 单个转换
const idStr = book_data[0]._id.toString()

// 批量转换所有查询结果
const processedData = book_data.map(item => ({
  ...item,
  _id: item._id.toString()
}))

方法3:Schema全局配置自动转换

如果希望该模型的所有查询结果默认返回字符串格式的_id,可以在定义Schema时配置转换规则:

const bookSchema = new mongoose.Schema({
  // 原有字段定义
  title: String,
  slug: String,
  status: String
}, {
  // 序列化JSON时自动转换_id为字符串
  toJSON: {
    transform: (doc, ret) => {
      ret._id = ret._id.toString()
      return ret
    }
  },
  // 调用toObject()时自动转换_id为字符串
  toObject: {
    transform: (doc, ret) => {
      ret._id = ret._id.toString()
      return ret
    }
  }
})

配置后你直接将查询结果返回给前端做JSON序列化时,_id就会自动转为字符串格式,不需要额外处理。

内容的提问来源于stack exchange,提问作者Vpp Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:24:02