Mongoose 6.6.2中使用$lookup聚合填充ID数组返回空数组问题
解决Mongoose聚合$lookup返回空数组的问题
核心问题1:from参数错误
你当前代码里的from: '$dietaries'是错误的,from需要指定目标集合的名称(不是字段引用),比如你的dietaries数据存在名为dietaries的集合里,就直接写from: 'dietaries',去掉前面的$符号。
核心问题2:ID类型不匹配(常见隐藏问题)
如果你的xyz集合中dietaries数组存的是字符串格式的ID,而dietaries集合的_id是MongoDB的ObjectId类型,直接用$lookup会匹配失败,需要先把字符串ID转为ObjectId。
修正后的代码
情况1:dietaries数组元素已经是ObjectId类型
await mongoose.models.xyz.aggregate([ { $lookup: { from: 'dietaries', // 这里改为集合名称,去掉$ localField: 'dietaries', foreignField: '_id', as: 'dietaries' } } ]);
情况2:dietaries数组元素是字符串类型,需要转换
先通过$addFields把字符串ID转为ObjectId,再执行$lookup:
await mongoose.models.xyz.aggregate([ { $addFields: { dietariesIds: { $map: { input: '$dietaries', as: 'dietaryId', in: { $toObjectId: '$$dietaryId' } } } } }, { $lookup: { from: 'dietaries', localField: 'dietariesIds', foreignField: '_id', as: 'dietaries' } }, // 可选:移除临时字段dietariesIds { $project: { dietariesIds: 0 } } ]);
额外检查点
- 确认
xyz集合中的dietaries数组确实有值,且这些ID在dietaries集合中存在 - 确认Mongoose模型对应的集合名称正确(比如模型名为
Dietary,集合名默认是dietaries)
内容的提问来源于stack exchange,提问作者NITISH
相关产品推荐
相关产品推荐

