2016-05-05 3 views
2

Мне нужно сделать что-то вроде функции «Расширенный поиск» с помощью 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.

Мне просто интересно, есть ли лучший подход, который мог бы решить эту проблему с производительностью?

ответ

1
  1. вы можете быть предварительно рассчитаны данные за прошлые сезоны и сделать два шага запрос:

    а) получить прошлые данные б) получить текущие данные

  2. можно попытаться оптимизировать индексы что запрос

  3. оборудование: использование SSD

  4. оборудование: больше памяти

  5. ввести шардинга для частичной загрузки

+0

Спасибо большое за указание направления. Я, конечно, посмотрю на осколки, чтобы разделить нагрузку. Однако у меня есть вопрос о заранее рассчитанных данных. Я думал об этом раньше, однако, это только решит проблему, когда мы будем искать всю статистику времени. Когда пользователь задает пользовательский диапазон, а не 2012-2016, они выполняют поиск на 2010-2013 годы. У нас нет способа предварительно рассчитать эти пользовательские диапазоны? Или я что-то упускаю? – ptgamr

+1

@ptgamr предварительный расчет должен быть основан на сезоне – profesor79

+0

Я тоже думал о том, чтобы оштрафовать, основываясь на сезонах ... – ptgamr

Смежные вопросы