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

MongoDB聚合管道:如何合并玩家对象数组并保留原字段

解决MongoDB聚合结果合并与玩家数组生成的问题

嗨,我来帮你搞定这个聚合管道的需求!要实现把多条结果合并成一个文档,同时保留原有字段并生成包含所有玩家的数组,$group阶段就是你需要的核心操作,搭配$push和$first就能完美实现需求。

具体实现思路

咱们用$group把所有输出文档归为同一组(通过_id: null实现),然后:

  1. 用$first来保留原有字段(假设这些字段在所有结果中是一致的;如果有不同值需要保留所有变体,可以换成$addToSet);
  2. 用$push把每个文档里的玩家对象收集到一个新的数组字段中。

示例代码

假设你当前的聚合输出是类似这样的多条文档:

{ "gameId": "game_001", "gameName": "星际争霸", "player": { "id": "p1", "name": "张三" } }
{ "gameId": "game_001", "gameName": "星际争霸", "player": { "id": "p2", "name": "李四" } }
{ "gameId": "game_001", "gameName": "星际争霸", "player": { "id": "p3", "name": "王五" } }

你需要添加的$group阶段如下:

{
  $group: {
    _id: null, // 将所有文档合并为一组
    // 保留原有字段,用$first取第一个文档的对应值(如果所有文档该字段一致,这样最稳妥)
    gameId: { $first: "$gameId" },
    gameName: { $first: "$gameName" },
    // 收集所有player对象到players数组中
    players: { $push: "$player" }
  }
}

可选优化:移除默认的_id字段

如果不想保留$group自动生成的_id字段,可以在$group之后再加一个$project阶段:

{
  $project: {
    _id: 0, // 隐藏_id字段
    gameId: 1,
    gameName: 1,
    players: 1
  }
}

最终输出效果

执行完上述阶段后,你会得到一个合并后的文档,既保留了所有原有字段,又有了包含所有玩家的数组:

{
  "gameId": "game_001",
  "gameName": "星际争霸",
  "players": [
    { "id": "p1", "name": "张三" },
    { "id": "p2", "name": "李四" },
    { "id": "p3", "name": "王五" }
  ]
}

内容的提问来源于stack exchange,提问作者Ashish Bairwa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:17:52