database-design - MongoDB 存储大量指标/分析数据的方法

标签 database-design mongodb statistics analytics

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

我们需要根据页面名称、客户端和操作类型来记录操作。理想情况下,我们需要下降到年/月/日/小时级别的统计数据,我们不需要或关心每秒或每分钟的浏览量。虽然这个文档结构看起来不错,但我知道 100 个访问者会生成 100 个新文档。

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

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

最佳答案

更新答案

在 mongo shell 中一起破解:

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

关于database-design - MongoDB 存储大量指标/分析数据的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5712698/

相关文章:

r - 如何通过在 R 中使用循环来查找 RMSE

java - 如何在 mongodb java spring 中使用 null dbref 保存对象?

mongodb - mgo 正在将 objectid 设置为 objectidhex,Mongodb 似乎无法读取它

php - 设计用于自动完成任务的调度程序的最灵活的方法是什么,并且实现起来也很实用?

php - 设计一个数据库来跟踪所有者

node.js - NodeJS 中的 cloudinary 文件上传遇到问题

r - 在 R 中分析 SVM (e1071)

r - 误差函数 Erf(z)

mysql - 用于存储用户配置文件的更好数据模型是什么?

mysql - 为产品变体设计数据库