在MongoDB中存储面向列的表以优化数据查询的最佳方式是什么

在MongoDB中存储面向列的表以优化数据查询的最佳方式是什么,mongodb,meteor,Mongodb,Meteor,我有一个大表,其中的列是user\u id、user\u feature\u 1、user\u feature\u 2、…、user\u feature\u n 因此,每一行对应一个用户及其特征 我通过将每列的值存储为一个数组,将该表存储在MongoDB中,例如 { 'name': 'user_feature_1', 'values': [ 15, 10, ... ] } 我使用Meteor从MongoDB中提取数据,这种存储方式有助于快速轻松地检索整个列的

我有一个大表,其中的列是user\u id、user\u feature\u 1、user\u feature\u 2、…、user\u feature\u n

因此,每一行对应一个用户及其特征

我通过将每列的值存储为一个数组,将该表存储在MongoDB中,例如

{
   'name': 'user_feature_1',
   'values': [
   15,
   10,
   ...
   ]
}
我使用Meteor从MongoDB中提取数据,这种存储方式有助于快速轻松地检索整个列的值,以便绘制图表

然而,这种储存方式有一个主要缺点;我无法存储大于16mb的阵列

有几种可能的解决方案,但没有一种似乎足够好:

  • 使用gridFS存储每列的值。我不确定meteor是否支持gridFS,并且它缺乏对数据切片的支持,也就是说,我可能需要只获取一列的前1000个值

  • 以面向行的格式存储表。例如

    { “用户id”:1, “用户功能”:10, “用户功能”:0.9,
    .... “用户功能”:42 }

  • 但我认为这种存储数据的方式对于查询要素列的值来说效率很低

    还是说MongoDB根本不适合,sql才是出路?但是Meteor不支持sql

    更新1: 我发现这篇关于mongodb中数组的有趣文章效率很低

    下面的解释来自

    数组-数组的文档是一个普通的BSON文档,键为整数值,从0开始,按顺序继续。例如,数组['red','blue']将被编码为文档{'0':'red','1':'blue'}。键必须按数字升序排列


    这意味着,如果值和键是浮点类型(16mb/128位),那么我们在一个文档中最多可以存储100万个值。

    还有第三个选项。针对每个用户和功能的单独文档:

    { u:"1", f:"user_feature_1", v:10 },
    { u:"1", f:"user_feature_2", v:11 },
    { u:"1", f:"user_feature_3", v:52 },
    { u:"2", f:"user_feature_1", v:4  },
    { u:"2", f:"user_feature_2", v:13 },
    { u:"2", f:"user_feature_3", v:12 },
    

    您将不会遇到文档增长问题,您可以查询“用户x的所有值”和“功能x的所有值”,而无需访问任何不相关的数据。

    16MB/64位浮点=2000000个未压缩数据点
    。什么样的图表要求每列至少有200万点???相反,请尝试:

    • 在s3服务器上保存图片
    • 使用像hadoop这样的MapReduce解决方案(可能是最好的选择)
    • 如果数字当前为浮点数,则将其减少为小整数
    • 在客户端实时计算数据(如有可能,首选)
    • 使用压缩算法,以便保存子集并对其余部分进行插值

    这就是说,在这个用例中,基于文档的数据库的性能将优于SQL数据库,因为SQL数据库将完全按照Philipp的建议执行。无论哪种方式,您都无法将多个16MB文件发送到客户端,如果客户端没有因为用户体验不佳而离开您,那么您将因服务器成本而破产:-)

    “似乎足够好”,“我想”。。。绩效不是关于感觉或观点,而是关于基准和概况。您的位置在哪里?每个值至少需要两个标识符(用户标识和用户特征)。这种方法不会占用空间吗?我正在考虑将mongodb和postgres同时用于meteor的可能性,刚刚发现有一些库支持meteor的postgresmeteor@Michael这肯定不是最节省空间的解决方案。总有一个折衷办法。绘制图形是必需的功能之一,我需要存储所有值以用于其他目的,例如统计计算。听起来,如果需要完美的分辨率,您应该使用Philipp建议的。