所以基本上我想实现与stackoverflow相同的功能:
viewed 59344 times
所以这里有一些背景信息:
- 我想只计算独特的访问次数。假设注册用户多次阅读文章(正在发展)
- 我使用MongoDB作为商店
- 我希望它接近实时
- 我的系统将有一个注册,但我也想计算匿名用户的意见
我知道计算唯一访问次数的最佳方式是通过注册,但事实是,大量用户将只是被动读者,他们不需要创建帐户来从应用程序中读取信息。据我了解,最方便的方法是保存阅读帖子的每个用户的IP地址。我也明白IP地址不会提供唯一性(一些不同的用户将具有相同的IP,因为它们位于同一ISP后面,一个用户可以拥有不同的IP,通过使用代理,等等)
使用Mongo并不是绝对必要的,只是因为现在所有东西都是用Mongo编写的,所以只有当它更快/更方便时才会切换。
背景
你是 某些 你需要追踪“独特”的观点吗?
我实际上不希望热门网站试图保持视图计数的独特性 - 更大更好,重新访问新评论仍然是显示新内容/评论/广告意义上的额外“观点”。 “正确性”还有其他可能的微妙之处,可能对您的用例很重要,也可能不重要,例如排除爬虫或您自己公司的用户/ IP。
我没有花时间跟踪唯一视图(这不是太有意义),而是考虑计算页面上的独特用户交互,例如投票/喜欢/评论。然后,您可以根据这些指标确定某个公式的“受欢迎程度”。这个方法有一个有趣的例子 Drupal的放射性模块,其中基于基于用户交互的新近度的活动计算“热度”度量。
要考虑的方法
1)对于MongoDB中的简单视图计数器,我会使用 $inc
在加载页面时增加视图计数。您可以根据需要按角色排除日志记录用户(例如管理员用户)。
2)对于更准确的视图计数器,我会将问题传递给a 网站分析 平台(您应该与您的网站一起使用以进行更详细的分析)。例如,您可以使用 Google AnalyticsAPI 或像开源应用程序 Piwik。 Web分析系统已经有了用于确定唯一用户/视图的解决方案,并且这些API调用可以通过JavaScript异步进行。
3)如果实现自己独特的视图跟踪一个明确的要求,我会使用一个单独的集合来跟踪视图和 UPSERT 根据您的独特性标准(每个独特的视图 user,article
对注册用户或 session_id,article
配对anon用户)。如果upsert导致插入,我会通过递增文章视图的计数器将其与方法#1(为文章视图递增视图计数器)结合起来。
背景
你是 某些 你需要追踪“独特”的观点吗?
我实际上不希望热门网站试图保持视图计数的独特性 - 更大更好,重新访问新评论仍然是显示新内容/评论/广告意义上的额外“观点”。 “正确性”还有其他可能的微妙之处,可能对您的用例很重要,也可能不重要,例如排除爬虫或您自己公司的用户/ IP。
我没有花时间跟踪唯一视图(这不是太有意义),而是考虑计算页面上的独特用户交互,例如投票/喜欢/评论。然后,您可以根据这些指标确定某个公式的“受欢迎程度”。这个方法有一个有趣的例子 Drupal的放射性模块,其中基于基于用户交互的新近度的活动计算“热度”度量。
要考虑的方法
1)对于MongoDB中的简单视图计数器,我会使用 $inc
在加载页面时增加视图计数。您可以根据需要按角色排除日志记录用户(例如管理员用户)。
2)对于更准确的视图计数器,我会将问题传递给a 网站分析 平台(您应该与您的网站一起使用以进行更详细的分析)。例如,您可以使用 Google AnalyticsAPI 或像开源应用程序 Piwik。 Web分析系统已经有了用于确定唯一用户/视图的解决方案,并且这些API调用可以通过JavaScript异步进行。
3)如果实现自己独特的视图跟踪一个明确的要求,我会使用一个单独的集合来跟踪视图和 UPSERT 根据您的独特性标准(每个独特的视图 user,article
对注册用户或 session_id,article
配对anon用户)。如果upsert导致插入,我会通过递增文章视图的计数器将其与方法#1(为文章视图递增视图计数器)结合起来。
解决问题的方法之一是使用cookie,一旦用户访问了该页面,您可以添加一个cookie,说明他已经访问过该页面,您无需再次计算他。您可以继续附加一些密钥以了解他访问过的所有页面。我知道可以删除cookie,但在任何解决方案中都会有权衡。
从mongoDB的角度来看,如果你想快速插入和读取,我会建议你做几件事。
1)在创建文章时,在可能的日志集合中创建这样的文档
{"_id" : "Article URL" , {"Hit" : 0}}
为什么我不建议添加IP地址或任何其他信息,因为您将添加IP地址,要更改mongoDB的文档的大小需要找到新的分配空间。从性能角度看哪个不好。由于您只是递增计数器,因此不会增加文档的大小,也不需要更改它。 +您可以拥有的文档的最大大小有限制。
2)预先创建文档将提供直接更新声明,并且无需检查文章ID是否存在。