单个文档中的多个文档或数组

Posted

技术标签:

【中文标题】单个文档中的多个文档或数组【英文标题】:Multiple documents or arrays within a single document 【发布时间】:2020-06-19 18:16:15 【问题描述】:

我正在使用 Mongoose 处理图像。我应该允许每个图像使用一个文档还是使用数组将多个图像放入单个文档中。我的意思是,这些模式中哪个更好——

new mongoose.Schema(
  image: [
    title: String,
    description: String,
    url: String,
  ],
);

或者这个——

new mongoose.Schema(
    title: String,
    description: String,
    url: String,
);

使用第一种方法,我们将只有一个文档。

编辑:为了提供全局——我们一直在使用 3 个集合(除了其他用于其他用途的集合)——landingPageGallerysubPageGallerysubPageGalleryArchived。这三个集合中的每一个都只存储一个文档,并且这些文档有一个数组,用于存储 URL 和其他关于登录页面和子页面的图像的详细信息。 subPageGalleryArchived 存储以前在 subPageGallery 中但现在已存档的图像。这些集合用于呈现网页。我们只有不到十几个页面,每个页面预计有十几个图像。

【问题讨论】:

你好,你确定你应该自己做吗?看来GridFS是镜像的最佳选择,网上也有很多例子。 问题是我们不必存储很多图像——也许不超过一打。鉴于规模,我不知道我们是否应该使用它。 您想将图像与其他内容相关联吗?在这种情况下,如果您有少量图像,第一个选项就可以了。 在文档中,我们存储的是图片的 URL,而不是实际的图片。那么也许这会让第一个选项更容易接受? 我不确定我是否理解正确。您是否希望只有一个文档来存储所有图像,这样它们就不会链接到任何其他实体,例如帖子、用户,对吧? 【参考方案1】:

编辑:我错误地理解了用例。一般来说,对于大多数问题,答案是“视情况而定”。可以参考以下guide进行对比。

如何为 MongoDB 数据库设计数据架构很大程度上取决于您如何访问它。

如果你有一个像网页这样的实体,它总是包含一组特定的图像。而且您总是需要将它们一起加载,第一种方法更可取,因为您只需查询一次数据库即可获取所需的所有数据。

如果您的图片与许多其他文档相关,您会希望根据关系或某些条件来查询图片,那么第二个选项更合适。

如果您不想将图像与任何其他实体关联,第一个选项对于少量图像是可行的,否则,根据您提供的字段,我假设第一个选项是存储一个文档图像无限。这不是一个好主意。

MongoDB 有一个 16MB 的文档大小limit,所以有一天如果你存储大量图像,你可能会达到限制。

还有很多操作一个文档级别。对于实际用例,您可能希望对图像应用过滤、排序、分组、更新、删除操作。当它们被存储为文档时,这样做会容易得多。

【讨论】:

人们将 Mongoose 中的文档与电子表格中的行进行比较。按照这个类比,在某种意义上,第一种选择不就相当于将整个电子表格的内容存储到一行中吗? 不是,真的没有可比性。如果要比较数据形状,更像是文档 fieldscolumnsdocumentsrows乙>。在您的情况下,您将图像放入一个 image field,这意味着您尝试将所有内容放入 cell 那么这意味着第一种方法比我想象的还要糟糕。

以上是关于单个文档中的多个文档或数组的主要内容,如果未能解决你的问题,请参考以下文章

更新 mongo 文档数组中的单个子文档的计数

从 MongoDB 和 Mongoose 中的多个文档创建单个文档

使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果

Mongoose:如何将子文档中的数组提取到父文档中的单个数组中

单个 jasper 文档中的多个查询

从单个文件打开多个文档