Как я могу записывать воспроизведение по пользователям без замедления моего приложения? - PullRequest
2 голосов
/ 23 января 2012

Я пытаюсь найти способ записи воспроизведения пользователя без замедления работы моего приложения, как в iTunes.

Мое приложение - это музыкальный веб-сайт, тесно интегрированный с Facebook, пользователи Facebook могут войти в систему и одобрить мое приложение, начать слушать песни и создавать собственные плейлисты и т. Д.

приложение построено с использованием php и mongodb.

Я уже пытался добавить эту функцию 2 раза, но у каждого метода есть свои недостатки, я просто хочу посмотреть, что думают ваши "профессионалы", потому что у меня есть только 1 год опыта в создании приложений.

метод 1

создайте коллекцию с именем plays, и каждый документ будет выглядеть следующим образом.

{ "user" => "user mongoid", "track" => "track mongoid" }

проблема с методом 1

проблема с этим в том, что он будет очень медленным, потому что когда я показываю страницу исполнителя мне нужно будет перечислить 20 самых последних треков, затем при получении треков мне придется проверять для каждого трека, насколько текущий пользователь его прослушал.

так что после получения треков мне нужно будет получить текущий проигрыватель:

// getting the tracks.
$cursor = $this->tracks->find();
$tracks = array();

foreach ($cursor as $t) {
  // getting the number of plays.
  $t['plays'] = $this->plays->find(array('user_id' => $user, 'track_id' => $t['_id']))->count();
  $tracks[]   = $t;
}

метод 2.

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

проблема с этим методом. MongoDB позволяет только 4 МБ для документа. я не могу просто вставить все в пользовательский документ.

Я искал по сети кого-то, кто сталкивался с подобной проблемой с Монго, но я не нашел ни одной.

Итак, как я могу записать воспроизведение каждого пользователя, не замедляя работу приложения?

Ответы [ 2 ]

0 голосов
/ 23 января 2012

Я бы предложил перенести историю треков в другую коллекцию. Вы правы, что постоянно действующий документ в коллекции не идеален (хотя максимальный размер документа теперь составляет 16 МБ).

Вам нужно вести историю всего или только последние 20? Если это только последние 20, то, возможно, вы можете оставить его встроенным.

Я бы также порекомендовал рассчитать количество воспроизведений в вашем приложении, выполнив приращение ($ inc) аналогично тому, как обрисовал в общих чертах Джон (ответ выше). Тогда вам не придется выполнять вычисления с count (), который может быть медленным.

{'user':'<user>', 'track':'<track>','plays':1}

Затем используйте что-то подобное для обновления

db.col.update({'user':'aUser'},{$inc : {'plays' : 1}});
0 голосов
/ 23 января 2012

Я не знаком с MongoDB, но не будет ли больше смысла изменить ваш «игровой» документ на что-то вроде:

{ "user" => "user mongoid", "track" => "track mongoid", "plays" => "number of plays" }

Таким образом, вам не нужно делать подсчет при отображении обзора исполнителя. Я подозреваю, что MongoDB может выполнять очень быстрый поиск / обновление, но, основываясь на других вопросах (например, производительность MongoDB по запросам агрегирования ), агрегация выглядит довольно медленной.

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