Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:设计统计仪表板模式_Mongodb_Database - Fatal编程技术网

MongoDB:设计统计仪表板模式

MongoDB:设计统计仪表板模式,mongodb,database,Mongodb,Database,我正在为统计仪表板设计一个数据库,数据将从我的主系统聚合并保存在Mongo中 我正试图找到建立数据库模型的最佳方法,我遇到的问题是用户可以根据不同的标准(如时间范围、年龄组、性别)过滤图表 这篇文章对于时间范围很有帮助,但我不知道如何将所有过滤器混合在一起 例如 生成每个产品的总页面浏览量图,mongo db记录应类似于: { timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"), type: “page_views”, produ

我正在为统计仪表板设计一个数据库,数据将从我的主系统聚合并保存在Mongo中

我正试图找到建立数据库模型的最佳方法,我遇到的问题是用户可以根据不同的标准(如时间范围、年龄组、性别)过滤图表

这篇文章对于时间范围很有帮助,但我不知道如何将所有过滤器混合在一起

例如

生成每个产品的
总页面浏览量
图,mongo db记录应类似于:

{
  timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
  type: “page_views”,
  product_id: 1550
  values: {
    0: { 0: 999999, 1: 999999, …, 59: 1000000 },
    1: { 0: 2000000, 1: 2000000, …, 59: 1000000 },
    …,
    58: { 0: 1600000, 1: 1200000, …, 59: 1100000 },
    59: { 0: 1300000, 1: 1400000, …, 59: 1500000 }
  }
}
如果用户只能过滤时间范围,这将非常有效,但是如果用户将时间范围与年龄组或性别混合,那么如何组织时间范围呢

{
    timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
    type: “page_views”,
    product_id: 1550
    values: {
        0: { 
            0: {
                total: 999999,
                age_group: {
                    teenagers: 4032932,
                    adults: 432942,
                    ...
                },
                gender: {
                    male: 4239423,
                    female: 4342343
                }

            },
            1: {
                total: 999999,
                age_group: {
                    teenagers: 4032932,
                    adults: 432942,
                    ...
                },
                gender: {
                    male: 4239423,
                    female: 4342343
                }
            },
            ....
            59: {
                total: 999999,
                age_group: {
                    teenagers: 4032932,
                    adults: 432942,
                    ...
                },
                gender: {
                    male: 4239423,
                    female: 4342343
                }
            }
        },
        ....
        59: { 
            0: {
                total: 999999,
                age_group: {
                    teenagers: 4032932,
                    adults: 432942,
                    ...
                },
                gender: {
                    male: 4239423,
                    female: 4342343
                }

            },
            1: {
                total: 999999,
                age_group: {
                    teenagers: 4032932,
                    adults: 432942,
                    ...
                },
                gender: {
                    male: 4239423,
                    female: 4342343
                }
            },
            ....
            59: {
                total: 999999,
                age_group: {
                    teenagers: 4032932,
                    adults: 432942,
                    ...
                },
                gender: {
                    male: 4239423,
                    female: 4342343
                }
            }
        },
    }
}

我看到的问题是,如果用户将(年龄范围、年龄组和性别)混合在一起,您希望存储聚合数据。在已经聚合的数据中添加搜索条件从根本上说是复杂的。您需要在原始数据和聚合数据之间进行权衡

  • 更多的原始数据意味着更容易混合和匹配不同的筛选条件,但也可能会降低运行速度
  • 更多的聚合数据意味着您需要预先定义可以过滤的标准
目前,您刚刚发现了原始数据和预计算数据之间的边界,您将看到,您已经为所需的标准找到了尽可能小的存储大小。如果您想要一个维度,则可能需要X个存储量。如果需要两个维度,则可能需要X^2的存储量。三维需要X^3等等


在某些时候,您可能需要考虑使用面向时间序列的数据库,例如,EndoxDB、Splunk或类似的。此类数据库针对存储和索引面向日志的原始数据进行了优化。

除了MongoDB之外,您是否对其他数据库开放?有一类时间序列数据库在聚合查询中表现出色,这意味着您只保存原始数据,其余的由数据库来完成。不存储预计算的聚合的另一个好处是,您可以沿途更改原始数据,例如更新/修订,并查看聚合反映的数据是否一致。@SergeiRodionov感谢您的回复。是的,我是开放的,但不确定哪一个是好的选择,因为稳定性是这里的一个关键。XDB看起来很有希望,但不确定在生产环境的这个阶段使用它是否明智,因为该项目仍然相对较新,尚未通过alpha,更喜欢开源解决方案,有什么建议吗?基于HBase的系统:OpenTSDB,Bosun(在OpenTSDB之上)和ATSD。前两个是自由和开放源码软件。披露:我为开发ATSD的公司工作。感谢您的回复@SergeiRodionov,我会查看它们