MongoDB聚合同时使用$lookup和$group返回空数组如何解决
问题根因
你在$group阶段只输出了_id和names两个字段,原始文档中的id字段没有被保留到聚合的后续阶段,导致$lookup执行时localField: 'id'指向的字段不存在,无法和users集合的id字段匹配,返回的user字段是空数组,后续的$unwind: '$user'会直接过滤掉所有无匹配的文档,最终结果为空。
修复方案
- 方案1:在
$group阶段额外保留id字段,用$first操作符提取同组的id值即可,修改后的$group阶段代码如下:
{$group: { _id: '$_id', id: {$first: '$id'}, // 新增这行保留id字段 names: {$push: {value: '$names.value', changed_at: '$names.changed_at'}} }}
- 方案2:如果你分组的
_id本身就是和id字段值一致的,也可以直接把$lookup的localField改为_id,不需要修改$group阶段:
{$lookup: { from: 'users', localField: '_id', // 把原来的id改成_id即可 foreignField: 'id', as: 'user', }}
补充说明
如果允许保留无匹配用户的文档,可以把$unwind改为带preserveNullAndEmptyArrays参数的写法,避免匹配不到用户时文档被过滤:
{$unwind: { path: '$user', preserveNullAndEmptyArrays: true }}
内容的提问来源于stack exchange,提问作者user16976770
相关产品推荐
相关产品推荐

