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
相关产品推荐
相关产品推荐

