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

MongoDB聚合查询中如何通过Lookup获取不重复的user_id

解决MongoDB聚合查询获取不重复user_id的问题

你当前的聚合流程仅完成了用户集合关联与user_id提取,但由于每个商品对应一条记录,同一用户发布的多个商品会返回多条重复的user_id,导致结果不符合预期。以下是两种可行的修改方案:

方案一:先关联再分组去重

在现有管道末尾添加$group阶段,按user_id分组以保留唯一值:

const aggregate = [
  { $match: {} },
  {
    $lookup: {
      from: 'users',
      localField: 'user_id',
      foreignField: '_id',
      as: 'user',
    },
  },
  {
    $unwind: {
      path: '$user',
      preserveNullAndEmptyArrays: true,  
    }
  },
  {
    $project: {
      _id: 0,
      user_id: 1,
    },
  },
  // 分组去重,保留唯一user_id
  {
    $group: {
      _id: '$user_id',
      user_id: { $first: '$user_id' }
    }
  },
  // 移除自动生成的_id字段
  {
    $project: {
      _id: 0,
      user_id: 1
    }
  }
];
const data = await ProductModel.aggregate(aggregate).allowDiskUse(true);

方案二:先去重再关联(性能更优)

先通过$group获取所有唯一的user_id,再关联用户集合,减少后续阶段的数据处理量:

const aggregate = [
  // 先分组提取唯一user_id
  {
    $group: {
      _id: '$user_id',
      user_id: { $first: '$user_id' }
    }
  },
  {
    $lookup: {
      from: 'users',
      localField: 'user_id',
      foreignField: '_id',
      as: 'user',
    }
  },
  {
    $unwind: {
      path: '$user',
      preserveNullAndEmptyArrays: true,  
    }
  },
  {
    $project: {
      _id: 0,
      user_id: 1,
    },
  }
];
const data = await ProductModel.aggregate(aggregate).allowDiskUse(true);

方案二更适合商品数据量较大的场景,能有效降低关联操作的计算开销。

内容的提问来源于stack exchange,提问作者Amos Evange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:57:23