为什么mongoose 6.0.12版本中findOne({ id })查询无法正常运行
1. 为什么返回结果中没有Mongoose默认的id字段
Mongoose默认确实会给所有Schema添加id虚拟字段,本质是把_id字段转成字符串返回,看不到它通常是两个原因:
- 你在定义User Schema时手动关闭了id虚拟字段,类似如下配置:
const userSchema = new Schema({ // 字段定义 }, { id: false // 手动关闭了默认id虚拟字段 })
- 你直接打印的是Mongoose返回的原始Document对象,虚拟字段默认不会出现在原始对象的打印结果中。如果需要查看,可以主动调用
toJSON()/toObject()方法,比如console.log(user.toJSON());也可以在Schema配置中开启虚拟字段序列化:
const userSchema = new Schema({ // 字段定义 }, { toJSON: { virtuals: true }, toObject: { virtuals: true } })
配置后无论是打印序列化后的对象还是接口返回都会自动携带id字段。
2. 为什么打印的_id是new ObjectId(...)格式而非字符串
MongoDB中存储的_id本身就是ObjectId类型,并非字符串,Mongoose查询返回时会保留它的原始类型,控制台打印时就会输出它的构造函数形式。如果需要获取字符串格式的_id,直接调用toString()方法即可:
const idStr = user._id.toString()
额外补充你之前遇到的查询问题原因
- 用
findOne({ id })始终返回第一个用户:是因为你的User集合中没有名为id的字段,MongoDB查询不存在的字段时,查询条件会被判定为永远匹配,最终返回全表扫描的第一条结果。 - 用
findOne({ _id: id })抛出转换错误:是因为合法的ObjectId必须是24位的十六进制字符串,你传入的id只有23位,不符合格式要求,Mongoose无法将其转换为ObjectId类型进行查询。
内容的提问来源于stack exchange,提问作者Nehal Ahmad
相关产品推荐
相关产品推荐

