首页 > 解决方案 > MongoDB聚合和数组内公共字段的总和

问题描述

我正在尝试从我从 API 获得的这个 json 中获取按玩家姓名分组的所有胜利和战斗的列表:

[
    {
        "createdDate": 1541411260,
        "players": [
            {
                "tag": "tag1234",
                "name": "name1",
                "battles": 2,
                "wins": 1
            },
            {
                "tag": "tag124567",
                "name": "name2",
                "battles": 1,
                "wins": 0
            },
            {
                "tag": "tag1234",
                "name": "name3",
                "battles": 3,
                "wins": 3
            }
        ]
    },
    {
        "createdDate": 1541411460,
        "players": [
            {
                "tag": "tag1234",
                "name": "name1",
                "battles": 1,
                "wins": 1
            },
            {
                "tag": "tag124567",
                "name": "name2",
                "battles": 1,
                "wins": 1
            },
            {
                "tag": "tag1234",
                "name": "name3",
                "battles": 0,
                "wins": 0
            },
            {
                "tag": "tag124567",
                "name": "name4",
                "battles": 1,
                "wins": 0
            }
        ]
    },
    {
        "createdDate": 1541455260,
        "players": [
            {
                "tag": "tag1234",
                "name": "name1",
                "battles": 0,
                "wins": 0
            },
            {
                "tag": "tag124567",
                "name": "name2",
                "battles": 4,
                "wins": 4
            },
            {
                "tag": "tag1234",
                "name": "name3",
                "battles": 6,
                "wins": 6
            }
        ]
    }

]

我正在使用的 mongo 查询如下,但我无法获得名称和战斗/胜利:

db.getCollection("logs").aggregate([
    { $unwind : '$players' },
    {
        $group: {
            _id: { name: '$players.name' },
            numBattles: { $sum: '$players.battles' },
            numWins: { $sum: '$players.wins' }
        }
    },
    {
        $project: {
            name: "$_id.name",
            numBattles: '$_id.numBattles',
            numWins: '$_id.numWins',
            _id: 0
        }
]
).pretty();

这给了我 0 个结果。还尝试了以下方法,但它返回了一组完整的玩家及其统计数据:

db.getCollection("logs").aggregate([
    {
        $group: {
            _id: { name: '$players.name' },
            numBattles: { $sum: '$players.battles' },
            numWins: { $sum: '$players.wins' }
        }
    },
    {
        $project: {
            name: "$_id.name",
            numBattles: '$_id.numBattles',
            numWins: '$_id.numWins',
            _id: 0
        }
    }
]
).pretty();

我们的想法是得到这样的结果:name1 - 3 场战斗和 2 场胜利,name2 - x 场战斗和 y 场胜利,...

有任何想法吗?谢谢你。

标签: mongodbgroup-byaggregate

解决方案


在您的$project阶段,您指的是_id仅包含哪些name字段,其他字段应直接引用,因此您只需将您的更改$project为:

{
    $project: {
        name: "$_id.name",
        numBattles: "$numBattles",
        numWins: "$numWins",
        _id: 0
    }
}

推荐阅读