关于将项目存储在嵌入式文档数组与集合中的MongoDB最佳实践

时间:2019-05-03 22:48:26

标签: arrays json mongodb mongoose compression

我有一个计划任务,每个用户每天产生约50次传输。这是一个示例传输,存储在MongoDB中收集的传输中:

transfer = {
  _id: 'ObjectId("...")',
  transferScheduleId: 'ObjectId("...")',
  TargetA: 'ObjectId("...")',
  TargetB: 'ObjectId("...")',     <-- optional
  SourceA: 'SourceId("...")',
  SourceB: 'SourceId("...")',     <-- optional
  value: 1234.5678,               <-- can be variable or constant
  date: '1900-01-01'
}

我仍在学习NoSQL / MongoDB,所以我想了解更多有关存储这种数据的不同方式的优缺点,并且我正在寻找反馈和想法。

目标与设置:由于我的应用旨在扩大用户数量,因此我想有效地存储转账以降低成本。传输在Web应用程序中生成,然后存储在MongoDB中。用户将定期访问此数据,并且当用户登录阵列时,该数据将通过带有mongoose的node.js API发送到Web应用程序。

我的问题是关于存储每次传输以及是否使用集合或嵌入式文档。鉴于MongoDB中BSON文档的限制为16MB,我首先得出结论,将转移文档存储在集合中。

此外,transferSchedule集合具有以下属性,可用于配置传输:

transferSchedule = {
  _id: 'ObjectId("...")',
  userId: 'ObjectId("...")',
  endDate: '1900-01-01' <-- optional
  startDate: '1900-01-01' 
}

我希望将转移嵌入到transferSchedule文档中,因为我假设这样可以更快地获取数据,因为用户的个人资料最多可以包含50个transferSchedules。我还假设我可以压缩嵌入式文档中的数据,但在下一段中将对此进行更多介绍。我的假设正确吗?通过userId获取50个transferSchedule对象(每个对象都有一个嵌入式传输数组)是否更快?还是更快地从集合中获取所有传输并通过transferScheduleId查找每个传输?

好的,因此在嵌入时,仍然存在文档的16 MB大小限制的问题。为了减少数组的大小,我想到了a。)压缩数组中的数据,但这需要每个用户和transferSchedule来获取完整的压缩数组,对其进行解压缩,添加新的传输,进行压缩并将其放入回到数据库。 相反,我想到的是b。)创建一个自定义压缩算法,该算法仅存储所需的属性以完全重新创建传输数组。该算法将仅存储已知传输执行的开始日期和结束日期,以及该时间段内所有传输上不会更改的属性。只要值,源或目标发生更改,就会创建一个新条目。如下所示:

transferSchedule = {
  _id: 'ObjectId("...")',
  userId: 'ObjectId("...")',
  endDate: null                      <-- optional
  startDate: '2019-01-01' 
  transfers: [
    {
      startDate: '2019-01-01',
      endDate: '2019-03-26',        <-- inclusive
      value: 100
      SourceA: 'SourceId("abc123")',
      TargetA: 'ObjectId("def456")',
    },
    {
      startDate: '2019-03-27',
      endDate: '2019-05-03',        <-- current date of most recent transfer
      value: 2000                   <-- change in data between March 26 & 27 
      SourceA: 'SourceId("abc123")',
      TargetA: 'ObjectId("def456")',
    },
  ]
}

将文档加载到Web应用程序中后,可以使用上面的transfers数组来重建该数组。

我不确定我是否考虑得过多。从SQL背景来看,我仍然不确定集合的可伸缩性和性能影响,也涉及CRUD操作。我的方法是否有效?我将不胜感激任何反馈,技巧和想法。谢谢!

0 个答案:

没有答案