我们计划使用MongoDB存储大量分析数据,如视图和点击.我不确定在MongoDB中构建文档以帮助查询和减少数据库大小的最佳方法.

我们需要根据页面名、客户端和操作类型记录操作.理想情况下,我们需要的数据是年/月/日/小时级别,我们不需要或不关心每秒或每分钟的浏览量.虽然这个文档 struct 看起来还可以,但我知道100个访问者将生成100个新文档.

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

Is there best practice way of doing this, either using $inc or Capped Collections?

推荐答案

Updated answer

在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')
    };
}

取决于您想跟踪哪些方面,可以考虑添加更多的集合(例如,以用户为中心的跟踪的集合).希望有帮助.

See also

Blogpost about Analytics Data

Mongodb相关问答推荐

为什么AllowDiskUse不能在$GROUP阶段的聚合管道中工作?

mongoose正在抛出Schema的错误has';t已在next.js中注册

Golang中的Mongo中值运算

使用 multer 在我的 MERN 前端显示 MongoDB 图像的正确语法是什么?

仅当特定字段存在于 MongoDB 中时才更新它

从 kubectl exec 获取返回值到 powershell 脚本

mongoDB 过滤、排序和排名结果

MongoDB:如何将所有文档合并到聚合管道中的单个文档中

如何将记录从一个 mongo 数据库插入另一个?

如何在 MongoDB 中存储时间?作为字符串?给出任意年/月/日?

使用 nodejs/mongoose 部分更新子文档

Mongoose 和新架构:返回ReferenceError: Schema is not defined

MongoDB:在集合上设置 TTL 索引时出错: sessions

MongoDB 存储 ObjectId 的数组

如何在 mongoDB 中聚合巨大的数组?

MongoDB 在 mongoengine 中使用 OR 子句

我们如何使用spring boot为mongodb创建自动生成的字段

如何在java中删除mongodb集合中的所有文档

如何使用 mgo 从 golang 中的 mongodb 集合中 Select 所有记录

按 id 删除记录?