Loopback-next中@referencesMany关联报错:无法找到对应_id的问题
Loopback @referencesMany关联MongoDB查询异常问题
问题场景
我在Loopback中定义了User模型,通过@referencesMany关联ListedStocks模型,代码如下:
@referencesMany( () => ListedStocks, {}, { mongodb: {dataType: 'ObjectId'}, }, ) stockIds?: string[];
当创建User并传入股票_id数组时,触发以下错误:
Error: Entity not found: ListedStocks with id "constraint {"_id":["62eeb4b42b59f883f02f381b"]}"
调试时发现MongoDB生成的查询语句为:
loopback:connector:mongodb all ListedStocks { where: { _id: [ '62eeb4b42b59f883f02f381b' ] } } null []
疑问:查询条件为何不是where: {_id: {$in: []}}?是否遗漏了配置?
原因与解决方法
Loopback的@referencesMany关联默认不会自动将数组条件转为$in查询,需要在关联配置中补充键映射并显式声明数组类型。
修正后的关联配置
修改@referencesMany的配置,指定关联键映射并启用数组类型支持:
@referencesMany( () => ListedStocks, { keyFrom: 'stockIds', // User模型存储关联ID的字段名 keyTo: '_id' // ListedStocks模型的主键字段 }, { mongodb: { dataType: 'ObjectId', isArray: true // 显式声明该字段为数组类型 } } ) stockIds?: string[];
额外注意事项
- 确保ListedStocks模型的主键
_id为ObjectId类型,数据库中对应文档的_id也保持一致(若传入字符串ID,Loopback通常会自动转换,但类型统一能避免潜在问题)。 - 若问题仍存在,可手动将传入的字符串ID转为ObjectId数组后再创建User:
import { ObjectId } from '@loopback/mongodb'; // 处理传入的stockIds const processedStockIds = req.body.stockIds.map(id => ObjectId.createFromHexString(id)); await userRepository.create({ ...req.body, stockIds: processedStockIds });
调整后,MongoDB连接器会生成_id: {$in: [...ObjectIds]}的正确查询条件,解决实体找不到的错误。
内容的提问来源于stack exchange,提问作者Shashwat Mishra.
相关产品推荐
相关产品推荐

