java - 从集合中选择/选择,即 mongoDB gridFS 的 block 或文件。我们可以在什么基础上做出这个决定?

标签 java mongodb gridfs database

我是 mongoDB 的新手,想用它来存储文件,即图像和视频(大小可以超过 40-50MB)。为此,我们可以使用 mongoDB gridFS。但在 gridFS 中,它们是两个集合,即 block 和文件。现在我想知道哪个集合(即 block 或文件)最适合我。我们如何或在何种基础上做出决定。

要求:

  • 存储图像和视频
  • 视频可以超过 40-50MB
  • 经常访问此媒体

最佳答案

这里可能有点困惑 GridFS实际上是这样,因为它实际上并不是 MongoDB“做的”事情,而实际上只是一个驱动程序规范,用于如何在标准集合中存储超过 16MB BSON 限制的数据。

为此,有 two collections由 GridFS 实现使用。一种通常称为"file",另一种称为“ block ”。它们有不同的用途,并且不能按照您的要求“选择”存储位置。

"file"集合用于“元数据”,它只是有关"file"的一些信息,基本上就是您想要的任何信息。这“描述”了文件,最重要的是充当对用于标识“ block ”集合中的文件的 _id 的“引用”。作为示例:

db.fs.files.findOne()
{
    "_id" : ObjectId("533b67d8afc27c15fc82caf4"),
    "filename" : "twig.pl",
    "chunkSize" : 262144,
    "uploadDate" : ISODate("2014-04-02T01:28:56.915Z"),
    "md5" : "9b10c69537126652aebc2742ca3ad69a",
    "length" : 267
}

因此有一个 _id 和有关该文件的一些其他数据。它只是一个标准集合,您可以这样查询它。

当然,“ block ”实际上指的是实际"file"的“部分”,简单来说,它看起来像这样:

{
    "_id" : ObjectId("533b67d8c6ed8872a7fa9ff0"),
    "files_id" : ObjectId("533b67d8afc27c15fc82caf4"),
    "n" : 0,
    "data" : BinData(0,"IyEvdXNyL2Jpbi9lbnYg....")
}

实际存储内容所需的数量将是多少。

至于 block 的“大小”,这通常取决于驱动程序实现,但通常会有一种方法来指定使用什么,但从规范来看:

"By default GridFS limits chunk size to 255k..."

但是,您当然应该尝试在您的实现中保持这一点的一致性。正如您从上面的“元”文档中看到的,规范是将这些信息与元数据一起“存储”,以便在回读和“构造”某种句柄时可以确定这一点。

因此,“驱动程序实现”实际上将处理 block 上的“读/写”操作如何发生,并且通常会执行一些操作将结果呈现为某种"file"或“流”。但这些只是“普通的 Collection ”,本身并没有什么特别的。因此,所有正常的查询和 CRUD 操作都可以像其他集合一样对这些集合进行操作。

关于java - 从集合中选择/选择,即 mongoDB gridFS 的 block 或文件。我们可以在什么基础上做出这个决定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25862979/

相关文章:

JavaFx ObservableSet 适配器

java - Camel : pollEnrich and access to the Exchange

mongodb - 使用官方 C# 驱动程序存储小文件时 MongoDb gridfs 中的 block 开销

node.js - 使用 gridfs-stream 将字符串写入 gridfs

java - 如何使 JScrollPane 滚动以跟随输入焦点?

java - 在不破坏封装的情况下保存和加载对象

MongoDB $project 提取某些属性(将其作为数组返回)

javascript - $pull 数组嵌入文档 MongoDB

C# redis vs mongodb 性能

mongoDB 作为 Grails 应用程序的文件存储