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 }
}
}
]);
如您所见,它由三个阶段组成。前两个旨在将每个文档复制到一个用于主队和另一个用于客队。为此,项目阶段首先在每个文档上创建一个包含真值和假值的新isHome
字段,然后展开阶段将其拆分为包含真值或假值的单独文档。
然后在分组阶段,我们让isHome
字段决定是在home
还是away
字段上进行分组。
如果我们可以在项目步骤中创建一个包含数组[$home, $away]
的team
字段会更好,但 mongo 仅支持在此处添加数组文字,因此解决方法。
相关文章:
- 将两个Json提要合并为一个,并按时间排序
- 将javascript对象(属性+值)合并到一个对象中
- jQuery将代码合并为一个函数
- 将多个jquery函数合并为一个
- 将嵌套数组的元素合并到一个大数组中
- MongoDB聚合将两个不同的字段合并为一个并获取计数
- 如何将多个 Blender JSON 模型合并到一个 Three.js Object3D 对象中
- 在angularJS中合并来自一个服务的两个数组
- 如何使用ES6将两个具有函数的对象合并为一个新对象
- 将文档的MongoDB字段合并到一个文档中
- 将两个图像合并为一个,并使用javascript进行溢出隐藏
- 将值和属性从一个对象合并到另一个对象
- 将两个云代码函数合并为一个函数
- 如何在Three.JS中将两个BufferGeometry合并为一个BufferGeometrics
- 有没有一个lodash函数可以合并两个对象并删除其中一个对象的属性(如果它们没有)'不存在于另一个中
- 如何将两个json对象合并为一个json
- 将json作为子文档合并到另一个json中
- 创建大量的js文件或者合并为一个文件是一种好的做法吗
- 将CSS和JavaScript合并到一个文件中并进行链接
- 我如何隐藏一个列在html表中,它有一个合并的标题