Skip to main content
 首页 » 编程设计

mongodb之在 MongoDB 中存储面向列的表以实现最佳数据查询的最佳方式是什么

2024年02月20日40飞鱼

我有一个大表,其中列为 user_id、user_feature_1、user_feature_2、...、user_feature_n

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

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

{ 
   'name': 'user_feature_1', 
   'values': [ 
   15, 
   10, 
   ... 
   ] 
} 

我正在使用 Meteor 从 MongoDB 中提取数据,这种存储方式有助于快速轻松地检索整个列的值以进行图形绘制。

但是,这种存储方式有一个很大的缺点;我无法存储大于 16mb 的数组。

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

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

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

    { '用户id': 1, “用户特征_1”:10, “user_feature_2”:0.9,
    .... “用户特征n”:42 }

但我认为这种存储数据的方式对于查询特征列的值效率很低

或者 MongoDB 根本不适合而 sql 才是正确的选择?但是Meteor不支持sql

更新 1: 我发现这篇有趣的文章讨论了 mongodb 中的数组效率低下。 https://www.mongosoup.de/blog-entry/Storing-Large-Lists-In-MongoDB.html

以下解释来自http://bsonspec.org/spec.html

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

这意味着如果值和键都是浮点类型(16mb/128bits),我们最多可以在文档中存储 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 的所有值”,而无需访问任何不相关的数据。