30-дневная статистика с MongoDB - PullRequest
0 голосов
/ 26 октября 2018

В настоящее время я пытаюсь создать систему ранжирования с помощью mongodb, у меня есть записи статистики, которые должны быть распознаны в течение 30 дней, а затем удалены. У меня есть 3 вопроса, первый, как я могу подсчитать всю статистикупоследние 30 дней вместе в операции агрегации?

Это моя структура данных:

{
"_id" : ObjectId("5bd28682a353f11bb30ab9fe"),
"UUID" : "d98e8f70-314f-4858-ad43-7775b2564e38",
"rank" : -1,
"stats" : [ 
    { 
        "timestamp": 1198334588378,
        "stat_kills" : 1.0,
        "stat_deaths": 4.0,
        "points" : 10
    }, 
    {
        "timestamp": 1198334588378,
        "stat_kills" : 8.0,
        "stat_deaths": 1.0,
        "points" : 26
    }, 
    {
        "timestamp": 1198334588378,
        "stat_kills" : 5.0,
        "stat_deaths": 6.0,
        "points" : 4
    }, 
    {
        "timestamp": 1198334588378,
        "stat_items_pickedup" : 8.0,
        "stat_kills" : 7.0,
        "stat_deaths": 3.0,
        "points" : 34
    }
]
}

У меня есть запрос агрегации, который подсчитывает все точки, и он выглядит так:

db.test.aggregate(
[
    {
        $match: {
            "UUID" : "d98e8f70-314f-4858-ad43-7775b2564e38"
        }
    },
    {
        $unwind: {
            path : "$stats"
        }
    },
    {
        $group: {
            _id:"$UUID", points: {$sum : "$stats.points"}
        }
    },

]
);

Текущий результат:

  {"_id" : "d98e8f70-314f-4858-ad43-7775b2564e38", "points" : 74}

желаемый результат:

{
"UUID":"d98e8f70-314f-4858-ad43-7775b2564e38", 
"points":74,
"stat_kills":(sum of all kills),
"stat_death" : (sum of all deaths),
"stat_items_pickedup": (sum of all items picked up)
}

Проблема в том, что я не знаю всех полей, которые нужно сложить, они всегда разные, и их может быть 10 полейно они также могут быть 2 или только 1 полем статистики, есть ли способ агрегирования для достижения этого?Структура базы данных не является окончательной, поэтому, если она требует изменения, вы можете, и я приму изменения, мой второй вопрос: как я могу удалить запись списка, которая старше 30 дней, отметка времени java system.currenttimemilis, чтобы я мог запуститьпоиск агрегации на клиенте java, но как удалить записи списка в агрегации?У меня нет там кода, потому что я понятия не имею, как это сделать, вопрос 3d: как я могу получить ранг для данного документа на основе всех баллов, которые он имеет?чем больше у него очков, тем лучше будет ранг, который он получит, поэтому я могу вставить ранг или, возможно, поле баллов в корневой документ с рудой uuid? Всегда ли я буду проводить агрегацию для этого?Танки за помощь

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете попробовать что-то вроде этого

db.collectionName.aggregate([
    {
        $unwind: {
            path : "$stats"
        }
    },
    {
        $match: {
            "stats.timestamp": {
                $gte: (Math.round(new Date().getTime()) - 86400000*30)
            }
        }
    },
    {
        $group: {
            _id: "$UUID",
            stat_kills: {
                $sum: "$stats.stat_kills"
            },
            stat_deaths: {
                $sum: "$stats.stat_deaths"
            },
            points: {
                $sum: "$stats.points"
            },
            "rank": {
                $first: "$rank"
            }
        }
    }
])

Надеюсь, это поможет вам.Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...