В настоящее время я пытаюсь создать спортивный веб-сайт, где люди могли бы голосовать за то, сколько один игрок может выиграть в матче с другим игроком.Он будет сосредоточен вокруг тенниса, поэтому все матчи будут 1: 1, но проблема, с которой я сталкиваюсь, заключается в компиляции консолидированных результатов из моего набора пользовательских данных.
В настоящее время я использую MongoDB иЯ в значительной степени новичок в этом.Моей целью для окончательных результатов были бы такие вещи, как подсчет общего количества голосов каждого типа для каждого отдельного совпадения каждого игрока (вау).Поэтому, чтобы сделать это, я заметил, что структура агрегации, кажется, является инструментом, который я должен использовать.С учетом вышесказанного я успешно добился того, что намеревался сделать в конце концов, но мне интересно, есть ли "лучший" способ использовать инструмент агрегирования, чем тот, который я получил в итоге.Позвольте мне объяснить, поэтому вот обычная структура одного пользователя в моей коллекции пользователей:
{
name: 'something',
players: {
federer: {
mannarino: -2,
seppi: 1
}
mannarino: {
federer: 2,
seppi: 2
}
seppi: {
federer: -1,
mannarino: -2
}
}
}
Таким образом, как вы можете видеть, пользователи могут оценивать шансы на победу в любом матче соответственно для каждого теннисиста (по шкале от -2 «Сильно не согласен до победы» до 2 «Сильно согласен до победы»)
Теперь, чтобы просмотреть весь список и найти итоги для каждого теннисиста, мне нужно пройтись по каждому игрокуи затем повторить снова через все их соответствующие взаимодействия.Это двойной цикл for, который выглядит следующим образом:
for each target player {
for each opponent against target player {
Users.aggregate();
}
}
Я сильно упростил его, потому что сейчас я не на своем главном компьютере со своим кодом, но, надеюсь, идея все еще встречается.Я могу заменить приведенный выше псевдокод реальным кодом, чтобы получить дополнительные пояснения, когда вернусь домой, если это необходимо.
Теперь совокупность результатов подсчитывает каждый вид голосов (5 видов голосов, между -2,-1, 0, 1, 2) в цели: соединение оппонента и возвращает его в конце, где я могу сделать что-то, например, определить среднее качество взаимодействия.
Проблема в том, что моя команда агрегированияработает довольно большое количество раз.Прямо сейчас я смотрю, как максимум потенциальных теннисистов в моей базе данных будет около 80.Если это 80, это означает, что для запуска этой функции и создания моей консолидированной статистики из моих данных, введенных пользователем, мне нужно выполнить 6400 (80 x 80) агрегаций!Как я уже сказал, я все еще новичок в mongodb, но нормально ли так много бегать?Я попытался запустить его на своем компьютере, и казалось, что потребовалось некоторое время, когда было доступно всего 5 теннисистов (всего 25 прогонов агрегации, 5 х 5).
Есть ли лучший способ использовать агрегацию здесь, илиэто действительно единственное решение, которое у меня есть для создания моей статистики?Есть ли какой-нибудь способ, которым я могу использовать агрегацию, чтобы получить суммы взаимодействий всего игрока с каждым другим игроком в одной агрегации вместо агрегации 80 ++?
Так что я мог бы, например, убрать необходимость в циклев два раза.
for each target player {
Users.aggregate();
}
Таким образом, вместо агрегации 6400, мне нужно будет только сделать 80. Я чувствую, что это было бы намного эффективнее, но я не уверен, как структурировать мою агрегациюсделать это, или, если это то, что агрегационная структура даже способна сделать.
В любом случае, как я уже сказал, способ, которым я это структурировал, "работает" ... но мне просто интересно, есть лилучший способ, которым я мог бы сделать это.Спасибо.
Если мне нужно предоставить какие-либо дополнительные разъяснения, пожалуйста, дайте мне знать.