使用MongoDB与TypeORM时id字段为null导致查询失败的问题
TypeORM中Post实体id字段为null导致查询失败的解决办法
问题根源:你用@ObjectIdColumn()定义的id字段,会在MongoDB集合中生成一个独立的id字段,但MongoDB默认会自动创建_id作为主键,这两个字段没有关联,所以插入新记录时id字段会被设为null,调用findOne({id})自然匹配不到数据。
解决方法一:将id映射到MongoDB的_id
修改实体代码,给@ObjectIdColumn添加name: '_id'配置,让TypeORM把实体的id属性与MongoDB的_id字段绑定,避免生成多余的id字段:
import { Column, Entity, ObjectId, ObjectIdColumn } from 'typeorm'; @Entity() export class Post { @ObjectIdColumn({ name: '_id' }) id: ObjectId; @Column('text') title: string; @Column('text') content: string; @Column({ type: 'boolean', default: true }) active = true; }
修改后插入的记录只会保留_id字段,实体的id属性会自动对应_id的值,此时调用findOne({ id })就能正常查询到数据。
解决方法二:查询时使用_id字段
若不想修改实体结构,可直接在查询语句中使用MongoDB原生的_id字段匹配:
const post = await postRepository.findOne({ _id: targetId });
注意这里的targetId可以是ObjectId实例,也可以是对应的字符串格式ID。
额外说明
如果集合中已有id为null的旧数据,建议清理这些记录,或者手动将_id的值同步到id字段,避免后续查询出现异常。
内容的提问来源于stack exchange,提问作者milad shirian
相关产品推荐
相关产品推荐

