如何在MongoDB中轻松使用GridFS?

GridFS是用于存储和检索超过16 MB大小限制的BSON文档文件的规范 。

注意
GridFS 不支持多文档事务
相较于将一个文件存储在单条文档中,GridFS将文件分为多个部分或块[1],并将每个块存储为单独的文档 。默认情况下,GridFS使用的块默认大小为255kB;也就是说,除最后一个块,GridFS会将文件划分为255 kB的块 。最后一个块只有必要的大小 。同样,最后的那个块也不会大于默认的块大小,仅使用所需的空间以及一些其他元数据 。
GridFS使用两个集合来存储文件 。一个集合存储文件块,另一个集合存储文件元数据 。GridFS集合一节详细介绍了每个集合 。
当你从GridFS查询文件时,驱动程序将根据需要重新组装该文件所有的块 。你可以对GridFS存储的文件进行范围查询 。你还可以从文件的任意部分访问其信息,例如“跳到”视频或音频文件的中间 。
GridFS不仅可用于存储超过16 MB的文件,而且还可用于存储您要访问的任何文件而不必将整个文件加载到内存中 。另请参阅何时使用GridFS 。
 
什么时候使用GridFS
 
在MongoDB中,使用GridFS存储大于16 MB的文件 。
在某些情况下,在MongoDB数据库中存储大型文件可能比在系统级文件系统上存储效率更高 。
  • 如果文件系统限制了目录中文件的数量,则可以使用GridFS来存储所需数量的文件 。
  • 当你要访问大文件部分的信息而不必将整个文件加载到内存中时,可以使用GridFS来调用文件的某些部分,而无需将整个文件读入内存 。
  • 当你希望保持文件和元数据在多个系统和设施之间自动同步和部署时,可以使用GridFS 。使用地理分布的复制集时,MongoDB可以自动将文件及其元数据分发到多个mongod实例和设施 。
如果您需要对整个文件的内容进行原子更新,请不要使用GridFS 。或者,您可以存储每个文件的多个版本,并在元数据中指定文件的当前版本 。上传文件的新版本后,您可以原子更新元数据中指示为“最新”状态的字段,然后在需要时删除以前的版本 。
此外,如果文件均小于16 MB BSON文档大小限制,请考虑将每个文件存储在单个文档中,而不是使用GridFS 。您可以使用BinData数据类型存储二进制数据 。有关使用BinData的详细信息,请参见驱动程序文档 。
 
使用GridFS
 
要使用GridFS存储和检索文件,请使用以下任一方法:
  • MongoDB驱动程序 。请参阅驱动程序文档,以获取有关将GridFS与驱动程序一起使用的信息 。
  • mongofiles命令行工具 。有关文档,请参见mongofiles参考 。
 
GridFS Collections
 
GridFS将文件存储在两个集合中:
  • 块存储二进制块 。有关详细信息,请参见chunks集合 。
  • 文件存储文件的元数据 。有关详细信息,请参见文件集合 。
GridFS通过使用存储桶名称为每个集合添加前缀,将集合放置在一个公共存储桶中 。默认情况下,GridFS使用两个集合以及一个名为fs的存储桶:
  • fs.files
  • fs.chunks
您可以选择其他存储桶名称,也可以在一个数据库中创建多个存储桶 。完整集合名称(包括存储桶名称)受命名空间长度限制 。
块集合
块[1]集合中的每个文档都代表了GridFS中表示的文件的不同的块 。此集合中的文档具有以下格式:
{"_id" : <ObjectId>,"files_id" : <ObjectId>,"n" : <num>,"data" : <binary>}chunks集合中的文档包含以下字段:
  • chunks._id
  • 块的唯一ObjectId 。
  • chunks.files_id
  • 在files集合中指定的“父”文档的_id 。
  • chunks.n
  • 块的序列号 。GridFS从0开始对所有块进行编号 。
  • chunks.data
  • 块BSON二进制类型的荷载 。
文件集合
文件集合中的每个文档代表GridFS中的一个文件 。
{"_id" : <ObjectId>,"length" : <num>,"chunkSize" : <num>,"uploadDate" : <timestamp>,"md5" : <hash>,"filename" : <string>,"contentType" : <string>,"aliases" : <string array>,"metadata" : <any>,}files集合中的文档包含以下一些或全部字段:


推荐阅读