总和mongodb中两个字段的出现次数

时间:2016-06-04 07:44:52

标签: mongodb mongoose mongodb-aggregation

我有一组名为游戏的文档,看起来像这样

Allocation 1 : 1st Jan - 31st Jan
Allocation 2:  2nd Jan – 28th Jan
Allocation 3 : 5th Jan – 27th Jan
Allocation 4:  15th Jan – 2nd Feb

现在我希望MongoDB输出:

{ winner: 'oakis', loser: 'test' },
{ winner: 'test', loser: 'oakis' }

我一直在关注聚合,mapReduce和distinct,但没有成功。 我希望你能帮助我!

编辑:

我有一个名为"并且#34;这也是一个布尔值。如何在结果中实现绑定游戏? (游戏中的每个玩家都有一个字段,player1& player2) 结果应该是: { _id: 'oakis', wins: 1, losses: 1 }, { _id: 'test', wins: 1, losses: 1 }

EDIT2:

解决这个问题!

{ _id: 'name', wins: 3, losses: 1, tied: 1 }

1 个答案:

答案 0 :(得分:2)

使用聚合框架,您可以使用如下所示的管道。本质上,它首先将数据投影到形式为[{name: $winner, wins: 1, losses: 0}, {name: $loser, wins: 0, losses: 1}]的2元素数组中,然后展开数组以生成单个元素数组,然后按名称对其进行分组,并总结胜负。

games.aggregate(
    [
        { 
            $project: { 
                scores: [
                    { name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 } }, 
                    { name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 } }
                ] 
            } 
        }, 
        { 
            $unwind: '$scores' 
        }, 
        { 
            $group: {
                 _id: "$scores.name", 
                wins: { $sum: "$scores.wins" }, 
                losses: { $sum: "$scores.losses" } 
            } 
        }
    ]
)