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操作符:
- 导入MongoDB的
ObjectId(需确保项目已安装mongodb依赖) - 转换ID数组类型
- 执行查询
示例代码:
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
相关产品推荐
相关产品推荐

