所以基本上我想实现与stackoverflow相同的功能:
viewed 59344 times
所以这里有一些背景信息:
据我所知,计算唯一身份访问次数的最佳方法是通过注册,但事实是,很大一部分用户只是被动读者,他们不需要创建帐户来从应用程序中读取信息。据我了解,最方便的方法是保存阅读帖子的每个用户的IP地址。我也明白IP地址不会提供唯一性(一些不同的用户将拥有相同的IP,因为它们位于同一ISP之后,一个用户可以拥有不同的IP,通过使用代理,等等)
Mongo的使用并不是绝对必要的,只是因为现在所有东西都是用Mongo编写的,所以只有当它更快/更方便时才会切换。
答案 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的文档。