【发布时间】:2015-02-01 19:54:08
【问题描述】:
我正在处理一个项目,该项目需要我将大量对象存储在链接到父对象的数组中,类似于将社交媒体 cmets 存储到其原始帖子。对我来说,为子文档/cmets 数组组织数据的最佳方式是什么?
将子对象放在不同的集合下并引用其父对象是否被认为是最佳做法,还是直接将它们全部放在父对象中更理想?
【问题讨论】:
我正在处理一个项目,该项目需要我将大量对象存储在链接到父对象的数组中,类似于将社交媒体 cmets 存储到其原始帖子。对我来说,为子文档/cmets 数组组织数据的最佳方式是什么?
将子对象放在不同的集合下并引用其父对象是否被认为是最佳做法,还是直接将它们全部放在父对象中更理想?
【问题讨论】:
我在这里稍微讨论一下,请先阅读: https://stackoverflow.com/a/27285313/68567
对于您的情况,选项 3(将一些数据保留在您的主要模型中)可能是最好的。关键是避免数组无限制增长。
这与 Mongodb 分配文档的方式有关。 http://docs.mongodb.org/manual/core/storage/ “MongoDB 中的每个文档都存储在一个记录中,该记录包含文档本身和额外的空间或填充,它允许文档随着更新的结果而增长。”
当节点分配新文档时,它会根据插入文档的大小和集合中已有文档的大小来分配空间。 (在上面的链接中阅读更多内容。)如果您的某些文档比其他文档大几个数量级,这可能会导致碎片化。
避免在“cmets”子文档数组中包含过多文档的方法是使用 $push 和 $slice 命令。 http://docs.mongodb.org/manual/reference/operator/update/slice/
所以存储“最近的 5 个”并在项目首次加载时显示它们。 (或最旧的,或您想要使用的任何其他排序标准。)然后为用户提供一种加载更多内容的方法,该方法将对包含所有这些内容的集合进行单独的往返。
【讨论】: