Javascript MongoDB聚合将两个不同的字段合并为一个字段并获取计数
我在MongoDB中有以下数据:Javascript MongoDB聚合将两个不同的字段合并为一个字段并获取计数,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我在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}, ...}] 我可以通过两个聚合调用将每个节点分别连接到各自的阵列: [{$
[{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}}}]
及
结果
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 }
}
}
]);
如你所见,它包括三个阶段。前两个是为了将每个文档复制为主队和客队各一个文档。为此,项目阶段首先在包含真值和假值的每个文档上创建一个新的isHome
字段,然后展开阶段将其拆分为包含真值或假值的单独文档
然后在分组阶段,我们让isHome
字段决定是在home
字段分组还是在away
字段分组
如果我们可以在项目步骤中创建一个team
字段,其中包含数组[$home,$away]
,那就更好了,但是mongo只支持在这里添加数组文本,因此解决方法是这样的
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 }
}
}
]);