MongoDB Подходы для хранения большого количества данных показателей/аналитики
Мы планируем использовать MongoDB для хранения большого количества аналитических данных, таких как просмотры и клики. Я не знаю, как лучше структурировать документы в MongoDB, чтобы помочь запросить и уменьшить размер базы данных.
Нам нужно снова записать действия с именем, клиентом и типом действия. В идеале нам нужны статистические данные, которые идут вниз по уровню год/месяц/день/час, нам не нужно или не заботится о просмотрах в секунду или минуту. Хотя эта структура документов выглядит нормально, я знаю, что 100 vistors будут генерировать 100 новых документов.
{
"_id" : ObjectId( "4dabdef81a34961506040000" ),
"pagename" : "Hello",
"action" : "view",
"client" : "client-name",
"time" : Date( "Mon Apr 18 07:49:28 2011" )
}
Есть ли лучший способ сделать это, используя $inc или Обрезанные коллекции?
Ответы
Ответ 1
Обновленный ответ
Взломанные вместе в оболочке монго:
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')
};
}
В зависимости от того, какие аспекты вы хотите отслеживать, вы можете подумать о добавлении большего количества коллекций (например, коллекции для пользовательского отслеживания). Надеюсь, что это поможет.
См. также
Blogpost о данных Google Analytics
Ответ 2
Я бы не слишком беспокоился о космосе, Mongo может масштабироваться довольно много бесконечно в этом отношении, добавив больше места, было бы разумно дешево.
Одна вещь, о которой нужно знать, - это тот факт, что если вы будете продолжать обновлять документ, его размер будет расти, а это значит, что Mongo в конечном итоге должен будет найти для него новое место в индексе. Если у вас есть много документов, которые обновляются и увеличиваются в размерах, Mongo должен будет скопировать эти документы по всему миру, это может значительно замедлить работу. Конечно, все зависит от того, сколько трафика вы ожидаете.
Основываясь на моем опыте, перейдите в простой формат документа, где вам не нужно обновлять документы, это может осложнить ваш запрос позже, но вы можете использовать map/reduce для получения любой информации, которая вам нужна, независимо от вашего документа структура (уменьшение карты очень гибкое, учитывая достаточный опыт, что вы можете что-либо сделать).