gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:01:19 24 4
gpt4 key购买 nike

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

文档示例:

{
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com