Группировка нескольких документов в mongodb - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать таблицу лидеров гольфа, основанную на нескольких раундах, что означает, что игрок мог сыграть 2 раунда с одним и тем же matchid.Это довольно просто, если есть только один раунд, я делаю это так:

db.roundScores.find( { "matchId": matchId } ).sort({"data.scoreTotals.toPar": 1});

Но если в матче больше одного раунда, я немного не в курсе, как я группирую каждого игрока, добавить оценки за раунды, а затем отсортировать их?

Я иду по этому пути, но не уверен, что это правильный путь?

var allRounds = db.rounds.find( { "matchId": matchId } );

var playerScores = [];
while( allRounds.hasNext() ) {

    var thisRound = allRounds.next();
    var allScores = db.roundScores.find( { "roundId": thisRound._id.$oid } );

    var i = 0;
    while( allScores.hasNext() ) {
        var thisScore = allScores.next();

        if(i > 0){

            // Should be updating the playerScores array finding the object for the player, But how???

        } else {

            // Creating a new object and adding it to the playerScores array //
            playerScores.push({
                "id":   thisScore.playerId,
                "toPar": thisScore.scoretotals.toPar,
                "points": thisScore.scoretotals.points
            });

        }

        i++;
    }

}

Я действительно надеюсь, что кто-то можетНаправь меня в правильном направлении.

Заранее спасибо: -)

------------ РЕДАКТИРОВАТЬ -----------

Вот примеры на документах

{"roundId": "8745362738", "playerId": "12653426518", "toPar": 3, "points": 27}
{"roundId": "8745362738", "playerId": "54354245566", "toPar": -1, "points": 31}
{"roundId": "7635452678", "playerId": "12653426518", "toPar": 1, "points": 29}
{"roundId": "7635452678", "playerId": "54354245566", "toPar": 2, "points": 23}

Результат должен быть:

1 playerId 54354245566 toPar 1 points 10
2 playerId 12653426518 toPar 4 points 2

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Для этого вы можете использовать агрегацию MongoDB.Пример кода ниже

db.roundScores.aggregate({
$group: {
    _id: "$playerId", 
    toPar: { $sum: "$toPar" },
    {$sort:{"toPar":1}}
 }
})

Это будет работать

0 голосов
/ 30 мая 2018

Вот что вам нужно:

db.roundScores.aggregate([{
    $group: {
        _id: "$playerId", // group by playerId
        toPar: { $sum: "$toPar" }, // sum up all scores
        points: { $sum: { $max: [ 0, { $subtract: [ "$points", 25 ] } ] } }, // sum up all points above 25
    }
}, {
    $sort: { "toPar": 1 } // sort by toPar ascending
}])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...