You need to enable JavaScript to run this app. MongoDB聚合匹配ObjectId数组分组统计abyssBattles集合队伍次数
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB聚合匹配ObjectId数组分组统计abyssBattles集合队伍次数

正确聚合查询实现方案

完整查询语句

db.abyssBattles.aggregate([
  // 1. 可选:添加筛选条件,按需调整
  {
    $match: {
      floor_level: { $in: ["12-1", "12-2", "12-3"] },
      // 如果需要按party包含特定id筛选,取消下面注释替换对应id即可
      // party: { $all: ["60b6edd41ec85acb419565dc", "其他需要匹配的id"] }
    }
  },
  // 2. 对party数组排序,统一相同元素不同顺序的数组为相同值,解决匹配问题
  {
    $addFields: {
      sorted_party: { $sortArray: { input: "$party", sortBy: 1 } }
    }
  },
  // 3. 第一次分组:按floor标识 + 排序后的party分组,统计每个组合的出现次数
  {
    $group: {
      _id: {
        // 如果是简化示例不需要拼接battle_index,直接改为floor: "$floor_level"即可
        floor: { $concat: ["$floor_level", "-", { $toString: "$battle_index" }] },
        party: "$sorted_party"
      },
      count: { $sum: 1 }
    }
  },
  // 可选:按count倒序排列,保证最终parties数组按次数从高到低排序
  {
    $sort: { count: -1 }
  },
  // 4. 第二次分组:按floor标识分组,聚合同floor下所有party统计结果
  {
    $group: {
      _id: "$_id.floor",
      parties: {
        $push: {
          party: "$_id.party",
          count: "$count"
        }
      }
    }
  },
  // 5. 调整输出字段名,符合预期结构
  {
    $project: {
      _id: 0,
      floor: "$_id",
      parties: 1
    }
  },
  // 可选:按floor标识升序排列结果
  {
    $sort: { floor: 1 }
  }
])

低版本兼容方案

如果你使用的MongoDB版本低于5.2不支持$sortArray,可以用下面三个stage替换上述第2步的$addFields排序逻辑:

{ $unwind: "$party" },
{ $sort: { party: 1 } },
{
  $group: {
    _id: "$_id",
    floor_level: { $first: "$floor_level" },
    battle_index: { $first: "$battle_index" },
    party: { $first: "$party" },
    sorted_party: { $push: "$party" }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 10:45:02