GridFS是一种将大型文件存储在MongoDB的文件规范:
MongoDB数据库以支持BSON格式保存二进制对象,但是MongoDB中的BSON对象最大不能超过4MB。
GridFs规范提供了一种透明的机制,可以将一个大文件分割成多个较小的文档。为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个块对象可被组合保存在一个块集合中。
GridFS文件存储原理:
驱动首先会在当前数据库创建两个集合:fs.files和fs.chunks,前者记录了文件名,文件创建时间,文件类型等基本信息;后者分块存储了文件的二进制数据(并支持加密这些二进制数据),分块的意思是把文件按照指定大小分割,然后存入多个文档中,“fs.files”怎么知道它对应的文件在哪?
在“fs.chunks”中有个”files_id”键对应“fs.files”的“_id”,“fs.chunks”还有一个键(int型)“n”,它表明这些块的先后顺序,这两个集合中的“fs”也是可以通过参数自定义的。

一个fs.files集合中的一条记录内容如下,即一个file的信息如下:

fastapi使用mongodb mongodb fs_fastapi使用mongodb


对应的fs.chunks中的chunk如下:

fastapi使用mongodb mongodb fs_数据库_02


默认chunk的大小是256K:

写入:

如果文件大于chunksize,则把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。

读取:

先据查询的条件,在fs.files中找到一个合适的记录,得到“_id”的值,再据这个值到fs.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。Mongo自带一个实现mongofiles,基本操作如下:

1. 列出所有文件:

fastapi使用mongodb mongodb fs_二进制_03


2. 上传一个文件:

fastapi使用mongodb mongodb fs_数据库_04


3. 下载一个文件:

fastapi使用mongodb mongodb fs_mongodb_05


4. 查找文件:

fastapi使用mongodb mongodb fs_二进制_06


参数说明:

-d 指定数据库,默认是fs

-u-p 用户名,密码

-h 指定主机

-port 指定主机端口

-c 指定集合,默认是fs

-t 指定文件的MIME类型,默认会忽略

-l 指定路径