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

