如何在MongoDB aggregation聚合查询分组结果中新增user_name字段
解决方案
针对你的需求,有两种可行的实现方案:
方案1:直接复用Activity表的冗余user_name字段
你的Activity模型中已经存储了user_name字段,同一user_id对应的所有活动记录的user_name值是一致的,只需要在$group阶段新增字段,用$first提取同分组的user_name即可:
Activity.collection.aggregate([ { "$group" => { "_id" => "$user_id", "user_name" => { "$first" => "$user_name" }, "distance" => { "$sum" => "$metric_distance" }, "time" => { "$sum" => "$metric_elapsed_time" }, }, }, { "$sort" => { "distance" => -1 } }, ])
说明:同分组内的user_name值完全相同,使用$last代替$first也可以得到相同结果,此方案性能最优,不需要额外关联查询。
方案2:关联User表获取最新user_name(解决冗余字段不同步问题)
如果Activity表的user_name可能和User表的最新值不同步,可以在分组后通过$lookup关联User表拉取最新的用户名:
Activity.collection.aggregate([ { "$group" => { "_id" => "$user_id", "distance" => { "$sum" => "$metric_distance" }, "time" => { "$sum" => "$metric_elapsed_time" }, }, }, # 关联User集合对应用户数据 { "$lookup" => { "from" => "users", "localField" => "_id", "foreignField" => "_id", "as" => "user_data" } }, # 提取user_name字段 { "$addFields" => { "user_name" => { "$arrayElemAt" => ["$user_data.user_name", 0] } } }, # 移除不需要的关联结果字段 { "$project" => { "user_data" => 0 } }, { "$sort" => { "distance" => -1 } }, ])
内容的提问来源于stack exchange,提问作者ipegasus
相关产品推荐
相关产品推荐

