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
相关产品推荐
相关产品推荐

