Мне нужно сделать что-то вроде функции «Расширенный поиск» с помощью MongoDB. Это спорт система, где игрок статистики собираются для каждого сезона, как это:Фильтровать большую базу данных по результату агрегирования
{
player: {
id: int,
name: string
},
goals: int,
season: int
}
Пользы можно искать данные по сезону, например: Я хочу найти игрока, который забил> 30 голов в сезоне 2012 - 2016 .
Я мог бы использовать агрегацию MongoDB:
db.stats.aggregate([
{ $match: { season: { $gte: 2014, $lte: 2016 } } }
{ $group: { _id: "$player", totalGoals: { $sum: "$goals" } } },
{ $match: { $totalGoals: { $gte: 30 } } },
{ $limit: 10 },
{ $skip: 0 }
])
Это работает отлично, скорость является приемлемой для коллекций с более чем 3 миллионов записей.
Однако, если пользователь просто хочет найти большой диапазон сезонов, скажем: игроков Статистика времени жизни. Агрегация оказывается очень очень медленной. И я понимаю, что MongoDB должен пройти через все документы и вычислить $ totalGoals.
Мне просто интересно, есть ли лучший подход, который мог бы решить эту проблему с производительностью?
Спасибо большое за указание направления. Я, конечно, посмотрю на осколки, чтобы разделить нагрузку. Однако у меня есть вопрос о заранее рассчитанных данных. Я думал об этом раньше, однако, это только решит проблему, когда мы будем искать всю статистику времени. Когда пользователь задает пользовательский диапазон, а не 2012-2016, они выполняют поиск на 2010-2013 годы. У нас нет способа предварительно рассчитать эти пользовательские диапазоны? Или я что-то упускаю? – ptgamr
@ptgamr предварительный расчет должен быть основан на сезоне – profesor79
Я тоже думал о том, чтобы оштрафовать, основываясь на сезонах ... – ptgamr