java - MongoDB 数据模型支持每个事件、每个日期范围的唯一访问者

标签 java mongodb aggregation-framework

我有多个网站,每个网站都有“触发”我想要跟踪的多个事件的访问者。我有来自所有网站的这些事件的日志,每个事件都填充了网站 ID、事件名称和执行该事件的用户 ID(为了简单起见,就这样吧)。

要求:

  1. 能够根据网站 ID 和事件名称获取有多少唯一身份访问者获得该信息。
  2. 这还应支持日期范围(该范围内的不同唯一访问者)。

我正在考虑使用以下数据模型为每个“website-id”创建一个集合(作为示例):

collection ev_{websiteId}:
[
    {
        _id: "error"
        dailyStats: [
            {
                _id: 20121005 <-- (yyyyMMdd int, should be indexed!)
                hits: 5
                users: [ 
                         {
                            _id: 1, <-- should be indexed!
                            hits: 1
                         }, 
                         {
                            _id: 2
                            hits: 3
                         },
                         {
                            _id: 3,
                            hits: 1
                         }
                ]
            },
            {
                _id: 20121004 
                hits: 8
                users: [ 
                         {
                            _id: 1,
                            hits: 2
                         }, 
                         {
                            _id: 2
                            hits: 3
                         },
                         {
                            _id: 3,
                            hits: 3
                         }
                ]
            },
        ]
    },
    {
        _id: "pageViews"
        dailyStats: [
            {
                _id: 20121005 
                hits: 500
                users: [ 
                         {
                            _id: 1, 
                            hits: 100
                         }, 
                         {
                            _id: 2
                            hits: 300
                         },
                         {
                            _id: 3,
                            hits: 100
                         }
                ]
            },
            {
                _id: 20121004
                hits: 800
                users: [ 
                         {
                            _id: 1, 
                            hits: 200
                         }, 
                         {
                            _id: 2
                            hits: 300
                         },
                         {
                            _id: 3,
                            hits: 300
                         }
                ]
            },
        ]
    },
]

我使用 _id 来保存事件 ID。 我使用 dailyStats._id 来保存事件发生的时间(yyyyMMdd 格式的整数)。 我使用 dailySattes.users._id 来表示用户的唯一 ID 哈希值。

为了获得唯一的用户,我基本上应该能够在给定的日期范围内运行(mapreduce?)数组中不同数量的项目(我会将日期范围转换为 yyyyMMdd)。

我的问题:

  1. 这个数据模型对您有意义吗?我担心这个模型随着时间的推移的可扩展性(如果我在某个客户端中有很多每日唯一访问者,它会导致一个巨大的文档)。 我正在考虑按 _id < [date as yyyyMMdd] 删除 dailyStats 文档。这样我就可以将文档大小保持在一个合理的范围内,但仍然存在限制。
  2. 是否有一种简单的方法来运行“upsert”,同时创建 dailyStats(如果尚未创建)、添加用户(如果尚未创建)并增加两者的“hits”属性?
  3. map-reduce 怎么样?您将如何处理它(需要在给定日期范围内的所有子文档的 users._id 上运行不同的操作)?新的聚合框架有更简单的方法吗?

顺便说一句 - 解决唯一访问者问题的另一个选择是使用 Redis 位图,但我不确定它是否值得保留多个数据存储(维护方面)。

最佳答案

对当前上述架构的评论很少。

我有点担心,因为您已经指出了可扩展性以及您实际执行的预聚合程度。

我在做指标时使用的大多数 Mongo 实例都与您指出的情况类似,但您似乎确实严重依赖于对单个文档进行更新并更新插入它的各个部分,这会减慢速度并可能导致一些锁定..

我可能会建议一条不同的路径,Mongo 甚至在与他们讨论制定指标时建议的路径。鉴于您已经拥有了您想要做的结构,我将创建以下内容:

{
  "_id":"20121005_siteKey_page",
  "hits":512,
  "users":[
   {
     "uid":5, 
     "hits":512,
   }
}

通过这种方式,您可以将文档大小限制为可以合理进行快速更新插入的大小。从这里您可以批量执行 MapReduce 作业,以进一步扩展您想要看到的内容。

这还取决于您的最终目标,您是否希望提供实时指标?您试图获得什么样的粒度? Redis map 可能是您至少想看看的东西:很棒的文章 here .

无论如何,解决这个问题都是一个有趣的问题:)

希望这对您有所帮助!

关于java - MongoDB 数据模型支持每个事件、每个日期范围的唯一访问者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13049494/

相关文章:

java - 是否可以通过 jboss-deployment-struction.xml 配置 JPA 2.1,为 Spring 4 和 Hibernate 4.3.10 配置 JBoss EAP 6.4.x?

java - 使用某些操作找到相应的电线起点和终点所需的行程数

java - 需要帮助在两个 Activity 之间传递数据

java - Android - XMPPError : jid-malformed - modify

java - 玩 Morphia MongoDB : The type Filter is already defined

python - MongoEngine是否在不同对象上缓存相同的引用?

php - 问题持久化嵌套的嵌套嵌入文档

node.js - 查找未邀请任何用户的用户

MongoDB 所有具有整数值的字段的总和

mongodb - 限制 MongoDB 中的查询结果