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

MongoDB $lookup聚合查询:仅返回关联集合中子集合匹配语言的条目

MongoDB $lookup聚合查询:仅返回关联集合中子集合匹配语言的条目

这个需求很常见,咱们只需要在聚合管道里给关联后的images数据加一层过滤逻辑就能解决。核心思路是:在$lookup关联完数据后,遍历每个关联的image文档,对它的title数组进行筛选,只保留和当前post的lang一致的条目。

修改后的聚合代码示例

Post.aggregate([
  { $match: query },
  {
    $lookup: {
      from: 'images',
      localField: '_id',
      foreignField: 'post_id',
      as: 'images',
    },
  },
  {
    $addFields: {
      images: {
        $map: {
          input: '$images', // 遍历所有关联的image
          as: 'image',
          in: {
            // 合并原image的所有字段,同时替换title为过滤后的结果
            $mergeObjects: [
              '$$image',
              {
                title: {
                  // 先过滤出匹配当前post语言的title条目
                  $arrayElemAt: [
                    {
                      $filter: {
                        input: '$$image.title',
                        as: 'titleEntry',
                        cond: { $eq: ['$$titleEntry.lang', '$lang'] }
                      }
                    },
                    0 // 取过滤后的第一个元素(因为每个语言应该只有一个条目)
                  ]
                }
              }
            ]
          }
        }
      }
    }
  }
]);

代码解释

  1. $map遍历关联的images:逐个处理每个从images集合关联过来的文档。
  2. $mergeObjects保留原字段:不用手动列出_id、post_id等字段,直接合并原image对象和修改后的title,保证其他字段不受影响。
  3. $filter筛选匹配语言的title:从title数组中挑出lang等于当前post的$lang的条目。
  4. $arrayElemAt转为单个对象:因为通常每个语言在title数组里只会有一个条目,用这个操作把过滤后的数组转为单个对象,避免返回数组格式的title。

如果你的场景中允许一个image对应多个同语言的title条目,只需要去掉$arrayElemAt部分,直接保留$filter的结果即可。

备注:内容来源于stack exchange,提问作者klabak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 14:29:33