![](/img/trans.png)
[英]Merge and aggregate some fields of two or more collections with identical schema mongodb
[英]MongoDB aggregate merge two different fields as one and get count
我在MongoDB中有以下数据:
[{id:3132, home:'NSH', away:'BOS'}, {id:3112, home:'ANA', away:'CGY'}, {id:3232, home:'MIN', away:'NSH'}]
是否可以通过汇总渠道获得每个团队的总比赛数?
预期结果:
[{team: 'NSH', totalGames: 2}, {team:'MIN', totalGames: 1}, ...}]
我可以通过两个聚合调用将每个单独地分配到它们自己的数组:
[{$group: {_id: "$home", gamesLeft: {$sum: 1}}}]
和
[{$group: {_id: "$away", gamesLeft: {$sum: 1}}}]
结果
var homeGames = [ { _id: 'NSH', totalGames: 1 }, { _id: 'SJS', totalGames: 2 }, ...]
var awayGames = [ { _id: 'NSH', totalGames: 1 }, { _id: 'SJS', totalGames: 4 }, ...]
但是我真的很想让它只处理一个查询。 如果不可能的话,使用JavaScript将这两个结果合并为一个的最佳方法是什么?
经过一番困惑之后,我找到了一种使用聚合管道来完成此工作的方法。 结果如下:
db.games.aggregate([{
$project: {
isHome: { $literal: [true, false] },
home: true,
away: true
}
}, {
$unwind: '$isHome'
}, {
$group: {
_id: { $cond: { if: '$isHome', then: '$home', else: '$away' } },
totalGames: { $sum: 1 }
}
}
]);
如您所见,它包括三个阶段。 前两个用于将每个文档复制到一个用于主队的文件和一个用于客队的文件。 为此,项目阶段首先在每个包含true和false值的文档上创建一个新的isHome
字段,然后展开阶段将其拆分成包含true或false值的单独文档。
然后在分组阶段,让isHome
字段决定是在home
字段还是away
字段上分组。
如果我们可以在项目步骤中创建一个包含数组[$home, $away]
的team
字段,那就更好[$home, $away]
,但是mongo仅支持在此处添加数组文字,因此可以解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.