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
字段
如果我们可以在项目步骤中创建一个 team
字段,包含数组 [$home, $away]
会更好,但是 mongo 只支持在此处添加数组文字,因此解决方法.
我在 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
字段
如果我们可以在项目步骤中创建一个 team
字段,包含数组 [$home, $away]
会更好,但是 mongo 只支持在此处添加数组文字,因此解决方法.