MongoDB: вызов Count () против отслеживания количества в коллекции - PullRequest
7 голосов
/ 19 мая 2011

Я перевожу нашу систему обмена сообщениями на MongoDB, и мне интересно, какой подход использовать в отношении различных статистических данных, таких как количество сообщений на пользователя и т. Д. В базе данных MS SQL у меня есть таблица, в которой у меня разные значения на пользователя, и ониобновляется с помощью триггера для соответствующих таблиц, так что я могу, например, узнать, сколько непрочитанных сообщений есть у UserA без вызова дорогостоящей операции SELECT Count(*).

Является ли функция count в MongoDB также дорогой?Я начал читать о карте / уменьшить, но мой сайт сильно загружен, поэтому статистика должна обновляться в режиме реального времени, и я понимаю, что карта / уменьшение - это длительная операция.

Каков наилучший (с точки зрения производительности) подход к сбору различных совокупных показателей в MongoDB?

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

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

4 голосов
/ 19 мая 2011

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

счетчики

{
    userid: 123,
    messages: 10
}

К сожалению (или к счастью?) В MongoDB нет триггеров, поэтому вы должны увеличить счетчик из логики вашего приложения:

db.counts.update( { userid: 123 }, { $inc: { messages: 1 } } )

Это даст вам лучшую производительность, и вы, вероятно, также поместите индекс в поле userid для быстрого поиска:

db.counts.ensureIndex( { userid: 1 } )
...