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

TypeORM搭配MongoDB时IN操作符无法正常工作求助

TypeORM使用In操作符查询ObjectIdColumn返回空数组的解决办法

问题场景

使用TypeORM的In操作符通过ID数组查询MongoDB实体时,始终返回空数组,相关代码及操作符实例如下:

查询代码:

import { In } from 'typeorm';
// 执行查询
...findBy({ _id: In(ids) })

实体_id字段定义:

@Entity()
export class Foo {
  @ObjectIdColumn({ generated: false, unique: true })
  _id: string;
  // 其他字段
  ...
}

打印的In操作符实例:

FindOperator {
  '@instanceof': Symbol(FindOperator),
  _type: 'in',
  _value: [ '1', '2', '3' ],
  _useParameter: true,
  _multipleParameters: true,
  _getSql: undefined,
  _objectLiteralParameters: undefined
}

原因分析

@ObjectIdColumn对应MongoDB中的ObjectId类型,即便实体中定义为string,数据库实际存储的是ObjectId对象而非字符串。直接传入字符串ID数组,TypeORM无法正确匹配数据库中的ObjectId类型数据,导致查询无结果。

解决方法

将字符串ID数组转换为ObjectId数组后再传入In操作符:

  1. 导入MongoDB的ObjectId(需确保项目已安装mongodb依赖)
  2. 转换ID数组类型
  3. 执行查询

示例代码:

import { In } from 'typeorm';
import { ObjectId } from 'mongodb';

// 将字符串ID转为ObjectId
const objectIds = ids.map(id => new ObjectId(id));
// 执行查询
const result = await fooRepository.findBy({ _id: In(objectIds) });

额外验证

可以先检查数据库中_id字段的实际类型:如果存储的是字符串而非ObjectId,则无需转换;但使用@ObjectIdColumn时,默认会将字段映射为MongoDB的ObjectId类型,因此转换是必要操作。

内容的提问来源于stack exchange,提问作者Majed Badawi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:39:22