Как я могу эффективно использовать MongoDB для создания аналитики в режиме реального времени с опорными точками? - PullRequest
1 голос
/ 17 ноября 2011

Итак, я постоянно получаю тонну данных, которые помещаются в коллекцию processedData.Данные выглядят так:

{
    date: "2011-12-4",
    time: 2243,
    gender: {
        males: 1231,
        females: 322
    },
    age: 32
}

Так что я буду постоянно получать множество таких объектов данных.Я хочу быть в состоянии увидеть всех "мужчин", которые старше 40 лет.Похоже, это неэффективный запрос из-за огромного размера данных.

Любые советы?

Ответы [ 2 ]

1 голос
/ 21 ноября 2011

Вообще говоря, вы не можете.

Однако могут быть некоторые комбинации клавиш, в зависимости от реальных требований.Вы хотите посчитать «мужчин старше 40» по всему набору данных или только за один день?

1 день: разбейте свои данные на ежедневные коллекции (processingData-20111121, ...), это поможет вашим запросам.Также вы можете кэшировать результаты такого запроса.

весь набор данных: предварительно агрегированные данные.То есть после вставки нового ввода данных сделайте что-то вроде этого:

db.preaggregated.update({_id : 'male_40'},
     {$set : {gender : 'm', age : 40}, $inc : {count : 1231}},
     true);

Аналогично, если вы заранее знаете все ваши запросы, вы можете просто их пересчитать (а не сохранять необработанные данные).

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

0 голосов
/ 21 ноября 2011

Полагаю, ваш целевой графический интерфейс - это веб-сайт?В этом случае вы ищете что-то под названием комета.Вы должны создать слой, который обрабатывает все данные и передает новые мутации вашему клиенту или шине событий (подробнее об этом ниже).Mongo не поддерживает данные в реальном времени, поскольку не генерирует ничего при мутации.Таким образом, вы можете использовать любое хранилище данных, которое вам подходит.

В зависимости от языка, который вы будете использовать, у вас есть различные варианты (для кометы):

  • Socket.io (nodejs) -Javascript
  • Cometd - Java
  • SignalR - C #
  • Libwebsocket - C ++

В большинстве случаев вам понадобится шина событий или сообщениеочередь для размещения событий мутации.Посмотрите на JMS, Redis или NServiceBus (в зависимости от того, что вы будете использовать).

...