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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:37:14