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

Mongodb 如何实现特定页面的视图数,mongodb,analytics,counter,Mongodb,Analytics,Counter,因此,基本上我想实现与stackoverflow相同的功能: viewed 59344 times 以下是一些背景信息: 我只想计算独特的访问。假设注册用户会多次阅读文章(这是不断发展的) 我使用MongoDB作为商店 我希望它接近实时 我的系统将有一个注册,但我想计算匿名用户的意见以及 我知道计算唯一访问量的最佳方法是注册,但问题是,大部分用户只是被动读者,他们不需要创建帐户来读取应用程序中的信息。据我所知,最方便的方法是保存每个阅读帖子的用户的IP地址。我也理解IP地址不会提供唯一性(一些

因此,基本上我想实现与stackoverflow相同的功能:

viewed 59344 times
以下是一些背景信息:

  • 我只想计算独特的访问。假设注册用户会多次阅读文章(这是不断发展的)
  • 我使用MongoDB作为商店
  • 我希望它接近实时
  • 我的系统将有一个注册,但我想计算匿名用户的意见以及
  • 我知道计算唯一访问量的最佳方法是注册,但问题是,大部分用户只是被动读者,他们不需要创建帐户来读取应用程序中的信息。据我所知,最方便的方法是保存每个阅读帖子的用户的IP地址。我也理解IP地址不会提供唯一性(一些不同的用户将拥有相同的IP,因为他们在同一ISP后面,一个用户可以通过使用代理、tor等拥有不同的IP)


    Mongo的使用并不是绝对必要的,只是现在所有的东西都是用Mongo编写的,所以只有在速度更快/更方便的情况下,我才会切换它。

    解决问题的方法之一是使用cookies,一旦用户访问了页面,您可以添加一个cookie,表示他已经访问了页面,您无需再次计算他。您可以继续添加一些键,以了解他访问过的所有页面。我知道cookies可以删除,但在任何解决方案中都会有折衷

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

    1) 在创建文章时,请在may be log集合中创建一个类似这样的文档

       {"_id" : "Article URL" , {"Hit" : 0}} 
    
    为什么我不建议添加IP地址或任何其他信息,因为在添加IP地址时,文档的大小将改变mongoDB需要找到新的分配空间。从性能角度来看,这是不好的。由于您只是增加计数器,因此它不会增加文档的大小,也不需要更改它的位置您对文档的最大大小有限制

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

    Background 您是否确定需要跟踪“独特”视图

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

    我不会花时间跟踪独特的视图(这没有太多意义),而是会计算独特的用户交互,比如页面上的投票/喜欢/评论。然后,您可以根据这些指标,通过一些公式确定页面的“受欢迎程度”。在中有一个有趣的例子说明了这种方法,其中“热度”度量是基于基于用户交互的最近程度的活动来计算的

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

    2) 为了获得更准确的视图计数器,我将把问题传递给一个平台(无论如何,您应该使用该平台进行更详细的分析)。例如,您可以使用或类似的开源应用程序。Web分析系统已经有了用于确定唯一用户/视图的解决方案,并且可以通过JavaScript异步调用这些用户/视图的API


    3) 如果实现您自己的唯一视图跟踪一个明确的需求,我将使用一个单独的集合来跟踪视图,并基于您的唯一性标准(每个
    用户的唯一视图、注册用户的文章对或非注册用户的会话id、文章对)。我会将此方法与方法1(增加文章视图的视图计数器)相结合,如果插入结果是插入,则增加文章视图的计数器。

    正如您所提到的,您的解决方案有一个重要问题-任何对internet工作方式稍有了解的人,可以将页面的浏览量提高到每天几千次。他只需要记录刷新并删除cookies。关于第二个提示,谢谢,这就是我一直在做的+1。此线程中的最佳解决方案(如选项3所述)。任何将无界数组推入数组的解决方案都会遇到性能和大小限制问题。@SalvadorDali:有一个有趣的元讨论。