В настоящее время я пытаюсь создать систему ранжирования с помощью 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? Всегда ли я буду проводить агрегацию для этого?Танки за помощь