我有一个大表,其中列为 user_id、user_feature_1、user_feature_2、...、user_feature_n
因此每一行对应一个用户及其特征。
我通过将每列的值存储为数组来将该表存储在 MongoDB 中,例如
{
'name': 'user_feature_1',
'values': [
15,
10,
...
]
}
我正在使用 Meteor 从 MongoDB 中提取数据,这种存储方式有助于快速轻松地检索整个列的值以进行图形绘制。
但是,这种存储方式有一个很大的缺点;我无法存储大于 16mb 的数组。
有几种可能的解决方案,但似乎没有一个足够好:
使用 gridFS 存储每列的值。我不确定meteor是否支持gridFS,并且它缺乏对数据切片的支持,也就是说,我可能只需要获取一列的前1000个值。
以面向行的格式存储表。例如
{ '用户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 的所有值”,而无需访问任何不相关的数据。