如何实现特定页面的视图数量

时间:2013-03-26 13:47:53

标签: mongodb analytics counter

所以基本上我想实现与stackoverflow相同的功能:

viewed 59344 times

所以这里有一些背景信息:

  1. 我想只计算一次独特的访问次数。假设注册用户多次阅读文章(正在发展)
  2. 我使用MongoDB作为商店
  3. 我希望它接近实时
  4. 我的系统会有注册,但我也想计算匿名用户的意见
  5. 据我所知,计算唯一身份访问次数的最佳方法是通过注册,但事实是,很大一部分用户只是被动读者,他们不需要创建帐户来从应用程序中读取信息。据我了解,最方便的方法是保存阅读帖子的每个用户的IP地址。我也明白IP地址不会提供唯一性(一些不同的用户将拥有相同的IP,因为它们位于同一ISP之后,一个用户可以拥有不同的IP,通过使用代理,等等)

    Mongo的使用并不是绝对必要的,只是因为现在所有东西都是用Mongo编写的,所以只有当它更快/更方便时才会切换。

2 个答案:

答案 0 :(得分:16)

背景

您是否某些需要跟踪“独特”观点?

我实际上不希望热门网站尝试保持视图计数的独特性 - 更大更好并且新评论的重新访问仍然是显示新内容/评论/广告意义上的额外“视图”。 “正确性”还有其他可能的微妙之处,可能对您的用例很重要,例如排除爬虫或您自己公司的用户/ IP。

我不会花时间跟踪唯一视图(这不是太有意义),而是考虑计算页面上的独特用户交互,例如投票/喜欢/评论。然后,您可以根据这些指标确定页面的“受欢迎程度”。 Radioactivity module for Drupal中有一个有趣的示例,其中“热度”指标是根据基于用户互动新近度的活动计算的。

考虑的方法

1)对于MongoDB中的简单视图计数器,我只需使用$inc在页面加载时提高视图计数。您可以根据需要按角色排除日志记录用户(例如管理员用户)。

2)为了获得更准确的视图计数器,我会将问题转移到web analytics平台(您应该将其与您的网站一起使用以进行更详细的分析)。例如,您可以使用Google Analytics API或像Piwik这样的开源应用程序。 Web分析系统已经有了用于确定唯一用户/视图的解决方案,并且这些API调用可以通过JavaScript异步。

3)如果要实施您自己的唯一视图,跟踪明确的要求,我会根据您的唯一性标准(user,article对注册用户的唯一视图或upsert使用单独的集合来跟踪视图和{{3}}匿名用户session_id,article对。如果upsert导致插入,我会通过递增文章视图的计数器将其与方法#1(为文章视图递增视图计数器)结合起来。

答案 1 :(得分:0)

您可以解决问题的方法之一是使用Cookie,一旦用户访问了该页面,您就可以添加一个Cookie,说明他已经访问过该页面,您无需再次计算他。您可以继续附加一些密钥来了解他访问过的所有页面。我知道可以删除cookie,但在任何解决方案中都会有权衡。

从mongoDB的角度来看,如果你想快速插入和阅读,我会建议你做几件事。

1)在创建文章时,在您的日志集合中创建这样的文档

   {"_id" : "Article URL" , {"Hit" : 0}} 

为什么我不建议添加IP地址或任何其他信息,因为要添加IP地址,要更改mongoDB的文档大小需要找到新的分配空间。从性能角度看哪个不好。由于您只是递增计数器,因此不会增加文档的大小,也不需要更改它。 +您可以拥有的文档的最大大小有限制。

2)提前创建文档将提供直接更新声明,无需担心是否存在文章Id的文档。

相关问题