Mongodb嵌入式文档的最佳实践

时间:2018-02-06 12:41:56

标签: mongodb

我有一个视频文档,每个视频都有一些特定的片段,根据视频的持续时间,它可能在100到5000之间。

videoModel = {
  id: 'vid334',
  codec: 'avc1.4d401e,mp4a.40.2',
  resolution : { "width": 854, "height": 480 },
  segments : [
   {
    segment : 1,
    file : seg-1.ts
   },
   {
    segment : 1,
    file : seg-1.ts
   },
   ....
  ]
}

创建每个视频后,无需更新视频或细分。

现在我想知道保存细分的最佳方法是什么?我应该在视频文档中嵌入片段还是将每个片段保存在单独的集合中?

1 个答案:

答案 0 :(得分:3)

没有最佳方式;只有你可以决定。嵌入与引用没有规则,通常引用其他文档中的文档。但客观地考虑这个:

您最终遇到的问题是" 无界数组" - 嵌入式文档阵列的主要代码味道。在某些时候,有足够的细分和无限数量的细分。你将达到文件的大小限制。此时,您的应用将被有效打破,因为您无法存储其他细分。而且您需要重构代码(和模型)来处理这种情况。

如果您的细分数量有限,并且您确定自己不会超过单个文档的大小,那么无限数组条件(及相关风险)将不适用。

另一个问题是使用如此大的数组时的复制和性能。对于数组的每次添加,整个数组都包含在oplog中($push()),因为oplog是 idempotent (您可以多次重放条目,结果相同)。因此,随着阵列的增长,oplog中条目的大小也会增加,复制可能会减慢并影响整体性能。