MongoDB - Использование твитов и подсчет данных - PullRequest
4 голосов
/ 27 мая 2011

Я использую API потоковой передачи Twitter в реальном времени, чтобы вести активный подсчет отдельных треков.Например, я хочу отслеживать, сколько раз твиты были «яблоко», «апельсин» и «груша».Я использую Mongo для хранения данных твитов, но у меня есть вопрос о том, как лучше всего получить счетчик для каждого трека, по которому я следую.

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

Опция 1

Выполнить запрос подсчета дляконкретный трек

 db.tweets.count({track: 'apple'})

Учитывая, что база данных твитов будет содержать МНОГО данных (потенциально миллионы) Интересно, может ли это быть немного медленно?

Опция 2

Создайте вторую коллекцию track_count и обновляйте атрибут count каждый раз, когда приходит новый твит:

{track:'apple', count:0}
{track:'orange', count:0}
{track:'pear', count:0}

Затем, когда приходит новый твит:

db.track_count.update( { track:"apple" }, { $inc: { count : 1 } } );

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

У кого-нибудь есть предложения относительно лучшего способа сделать это?

Ответы [ 2 ]

3 голосов
/ 29 мая 2011

Без сомнения, используйте отдельную коллекцию track_count, чтобы сохранить промежуточное количество совпадений.В противном случае вы будете перезапрашивать всю свою коллекцию tweets каждую секунду, которая будет становиться очень медленной и дорогой по мере роста объема данных.

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

1 голос
/ 29 мая 2011

У кого-нибудь есть предложения относительно лучшего способа сделать это?

Здесь нет «лучшего» метода. Это классический компромисс. Вы можете делать «счетчики», вы можете терпеть медленные запросы, вы можете запускать обычные задания по уменьшению карты.

  • Две записи => более быстрые запросы, больше операций записи
  • Одна запись => более медленные запросы, меньше операций записи
  • ежечасно M / R => немного устаревшие данные, немного больше записей

Обычно предлагается использовать счетчики. MongoDB, как правило, хорошо справляется с большими нагрузками записи, особенно с этим типом «приращения» или загрузки счетчиков.

Вы не получите больше скорости, если не пожертвуете чем-то. Диск, ОЗУ, ЦП. Поэтому вам придется выбирать компромисс в зависимости от ваших потребностей.


Примечание: уникально ли название трека?

Вы можете попробовать следующее:

{_id:'orange', count:0}
{_id:'pear', count:0}

Или для подсчета по дням:

{_id:'orange_20110528', count:0}
{_id:'orange_20110529', count:0}
{_id:'pear_20110529', count:0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...