草庐IT

用于按月或日聚合的指标的 MongoDB 索引策略

coder 2023-11-02 原文

我很好奇是否有任何最佳实践来索引按月/日聚合的集合的指标。

文档示例:

{
  track: {
    2012: { # year
      1: { # month
        page_views: ...,
        clicks: ...,
        visits: ...
      },
      5: {
        page_views: ...,
        clicks: ...,
        visits: ...
      },
      ...
  }
}

编辑:

因为有关于如何改进文档的讨论以及将其拆分的一些建议(我已经考虑过)。我会更新为什么要求是这样的。该文档用于跟踪用户。随着时间的推移跟踪他们的综合浏览量、访问量等。用户在文档上有其他数据。例如,有一个注册日期。目标是能够说出类似“显示在 X 日期注册并且在 A 和 B 跟踪日期之间拥有超过 Z 页面浏览量的用户”之类的话。如果没有嵌入,我无法想出一个模式来促进这一点。

更新文档示例:

{
  registration_date: ...,
  email: ...,
  track: {
    2012: { # year
      1: { # month
        page_views: ...,
        clicks: ...,
        visits: ...
      },
      5: {
        page_views: ...,
        clicks: ...,
        visits: ...
      },
      ...
  }
}

最佳答案

不幸的是,您的数据库模式对索引非常不友好。当您像那样嵌套对象时,您唯一的选择是为每个可能的年/月组合创建一个索引。也很难查询。例如,当您想要按降序获得最好的三个月时,您将很难在数据库上尝试这样做。

更好的选择是将年和月都放入对象中,将对象放在一个数组中(因为索引可以用于数组查找),并在年、月和唯一字段上创建一个唯一的复合索引周围的文件。

{
    name: "Some Unique Name",
    tracking:    [
        {year: 2011, month: 11, page_views: 235, clicks: 132, visits: 87 },
        {year: 2011, month: 12, page_views: 176, clicks: 122, visits: 67 },
        {year: 2012, month: 1, page_views: 53, clicks: 32, visits: 17 },
        {year: 2012, month: 2, page_views: 89, clicks: 72, visits: 67 },
        {year: 2012, month: 3, page_views: 99, clicks: 82, visits: 72 }
    ]
}

ensureIndex({name:1, tracking.year:1, tracking.month:1});

当您需要频繁访问个别日期、月份或年份的累积统计信息时,您可以将这些指标存储在单独的子文档中:

    tracking_daily: [
        ...
        {year: 2012, month: 3, day: 1, ...  }, 
        {year: 2012, month: 3, day: 2, ...  }, 
        {year: 2012, month: 3, day: 3, ...  }, 
        {year: 2012, month: 3, day: 4, ...  }, 
        {year: 2012, month: 3, day: 5, ...  }, 
        {year: 2012, month: 3, day: 6, ...  }, 
        {year: 2012, month: 3, day: 7, ...  }, 
        {year: 2012, month: 3, day: 8, ...  }, 
        ...
    ],
    tracking_monthly: [
        ...
        {year: 2011, month: 11, ... },
        {year: 2011, month: 12, ... },
        {year: 2012, month: 1, ...  },
        {year: 2012, month: 2, ...  },
        {year: 2012, month: 3, ...  } 
        ...
    ],
    tracking_yearly:    [
        ...
        {year: 2011, ...  },
        {year: 2012, ...  }
    ]

关于用于按月或日聚合的指标的 MongoDB 索引策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711767/

有关用于按月或日聚合的指标的 MongoDB 索引策略的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  4. ruby-on-rails - 协会的 Rails 索引 - 2

    我发现自己需要这个。假设cart是一个包含用户列表的模型。defindex_of_itemcart.users.each_with_indexdo|u,i|ifu==current_userreturniendend获取此类关联索引的更简单方法是什么? 最佳答案 indexArray上的方法与您的index_of_item方法相同,例如cart.users.index(current_user)返回数组中第一个对象的索引==给obj。如果未找到匹配项,则返回nil。 关于ruby-on-

  5. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  6. ruby - "undefined method"用于 rails 模型 - 2

    我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom

  7. Ruby on Rails regexp equals-tilde 与 array include 用于检查选项列表 - 2

    我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试

  8. ruby - 引用具有指定索引的枚举器值 - 2

    假设我有一个可枚举对象enum,现在我想获取第三个项目。我知道一种通用方法是转换成数组,然后使用索引访问,如:enum.to_a[2]但这种方式会创建一个临时数组,效率可能很低。现在我使用:enum.each_with_index{|v,i|breakvifi==2}但这非常丑陋和多余。执行此操作最有效的方法是什么? 最佳答案 你可以使用take剥离前三个元素,然后剥离last从take给你的数组中获取第三个元素:third=enum.take(3).last如果您根本不想生成任何数组,那么也许:#Ifenumisn'tanEnum

  9. ruby-on-rails - Ruby "Undefined Method"用于类方法 - 2

    Ruby初学者努力简单地将这个@@people散列的值打印到控制台classPerson#haveafirst_nameandlast_nameattributewithpublicaccessorsattr_accessor:first_nameattr_accessor:last_name#haveaclassattributecalled`people`thatholdsanarrayofobjects@@people=[]#havean`initialize`methodtoinitializeeachinstancedefinitialize(first_name,last_

  10. python - 用于 Python 或 Ruby 的 Amazon Book API? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:AmazonAPIlibraryforPython?我正在寻找一个AmazonAPI,它可以让我:按书名或作者查找书籍显示书籍封面获取有关每本书的信息(价格、评级、评论数、格式、页数等)Python或Ruby库都可以(我只想要最容易使用的库)。有什么建议么?我知道在SO上还有其他一些关于此的帖子,但这些API似乎很快就过时了。[几个月前我尝试了几个建议的Ruby库,但无法让它们中的任何一个工作。]

随机推荐