2011-04-19 106 views
15

我们正在使用MongoDB中存储大量的分析数据,如浏览和点击的计划。我不确定在MongoDB中构建文档的最佳方式,以帮助查询和减少数据库大小。MongoDB的途径来存储大量的度量/分析数据

我们需要记录行动agains一个页面名称,客户端和行动的类型。理想情况下,我们需要统计数据按照年/月/日/小时的水平进行计算,我们不需要或不关心每秒或每分钟的观看次数。尽管这个文档结构看起来不错,但我知道100个访问者会生成100个新文档。

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

是否有这样做的最佳实践方法,或者使用$incCapped Collections

回答

15

更新答案

在蒙戈外壳砍死在一起:

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 about Analytics Data

+0

有趣,你会查找()语法的样子,如果我想在过去的一天中显示的每个小时的意见“你好”的计数? – Tom 2011-04-21 06:21:40

+0

..那么这个解决方案不会是完全理想的。但请继续,我会发布更新。 – Matt 2011-04-21 07:07:22

+0

与此同时,您可能想看看http://cookbook.mongodb.org/patterns/unique_items_map_reduce/ – Matt 2011-04-21 07:13:54

1

我不会太担心空间,蒙戈可以扩展在这方面几乎无限见,加入了更多的空间将是相当便宜。

有一点需要注意的是,如果你保持更新文件的大小将增长,这意味着蒙戈最终需要找到在索引中的一个新的地方。如果你有很多文件正在更新并且规模不断增加,Mongo需要将这些文件复制到很多地方,这可以大大减缓文件的速度。当然,这一切都取决于你期望的流量。

根据我的经验,使用简单的文档格式,您不需要更新文档,稍后可能会使查询复杂化,但您可以使用map/reduce获取所需的任何信息,而不管您文件结构(给定足够的经验你可以做任何事情,地图缩减非常灵活)。