Агрегация и суммы MongoDB по общему полю внутри массива - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь получить список, в котором подсчитываются все победы и сражения, сгруппированные по имени игрока из этого json, который я получаю из API:

[
    {
        "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
            }
        ]
    }

]

Я использую следующий запрос монго, но я не могу получить имена и битвы / победы:

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 - х сражений и у побед, ...

Есть идеи? Спасибо.

1 Ответ

0 голосов
/ 07 ноября 2018

На вашем этапе $project вы ссылаетесь на _id, который содержит только name, и на другие поля следует ссылаться напрямую, поэтому вам просто нужно изменить $project на:

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