MongoDB Подходы для хранения больших объемов данных метрик / аналитики - PullRequest
15 голосов
/ 19 апреля 2011

Мы планируем использовать MongoDB для хранения больших объемов аналитических данных, таких как просмотры и клики. Я не уверен в том, как лучше структурировать документы в MongoDB, чтобы упростить запросы и уменьшить размер базы данных.

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

{ 
  "_id" : ObjectId( "4dabdef81a34961506040000" ),
  "pagename" : "Hello",
  "action" : "view",
  "client" : "client-name",
  "time" : Date( "Mon Apr 18 07:49:28 2011" )
}

Есть ли лучший способ сделать это, используя $ inc или Ограниченные коллекции ?

Ответы [ 2 ]

16 голосов
/ 20 апреля 2011

Обновленный ответ

Взломанный вместе в оболочке монго:

use pagestats;

// a little helper function
var pagePerHour = function(pagename) {
    d = new Date();
    return {
        page : pagename,
        year: d.getUTCFullYear(),
        month: d.getUTCMonth(),
        day : d.getUTCDate(),
        hour: d.getUTCHours(),
    }
}

// a pageview happened
db.pagestats.update(
    pagePerHour('Hello'),
    { $inc : { views : 1 }},
    true ); //we want to upsert

// somebody tweeted our page twice!
db.pagestats.update(
    pagePerHour('Hello'),
    { $inc : { tweets : 2 }},
    true ); //we want to upsert

db.pagestats.find();
// { "_id" : ObjectId("4dafe88a02662f38b4a20193"),
//   "year" : 2011, "day" : 21, "hour" : 8, "month" : 3,
//   "page" : "Hello",
//   "tweets" : 2, "views" : 1 }

// 24 hour summary 'Hello' on 2011-4-21
for(i = 0; i < 24; i++) {
    //careful: days (1-31), month (0-11) and hours (0-23)
    stats = db.pagestats.findOne({ page: 'Hello', year: 2011, month: 3, day : 21, hour : i})
    if(stats) {
        print(i + ': ' + stats.views + ' views')
    } else {
        print(i + ': no hits')
    };
}

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

См. Также

Блог о данных Google Analytics

1 голос
/ 28 апреля 2011

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

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

...