Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB聚合将两个不同的字段合并为一个字段并获取计数_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 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}, ...}] 我可以通过两个聚合调用将每个节点分别连接到各自的阵列: [{$

我在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}}}]

结果

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 }
        }
    }
]);