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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 14:45:03