@toc
MongoDB的单文档存储空间要求不超过16MB。对于超过16MB的大文件,MongoDB提供了GridFS来进行存储,通过GridFS,可以将大型数据进行分块处理,然后将这些切分后的小文档保存在数据库中。
GridFS如何存储文档
GridFS在存储大型文件时使用了两个集合:chunks
集合和files
集合。chunks
集合用来保存文件内容的二进制数据,files
集合用来保存文件的元数据
在保存文件时,GridFS会将文件分割成许多数据块(数据块的大小默认为255KB)。用fs.chunks集合保存这些数据块,用fs.files集合保存元数据。
在一般情况下,一个文件被拆分后,除最后一个chunk外,其他chunk的大小都是255KB
fs.files集合中只有一个文档,fs.chunks集合中则产生一个至多个文档。两个集合中的文档通过fs.files._id
和fs.chunks.file_id
这两个字段进行关联。MongoDB在存储大型文件时会自动关联。一般情况下不需要使用这两个字段,更不应该修改。
Chunks与files集合
chunks集合
chunks集合中的文档,用来保存文件内容的二进制数据。
{
"_id" : ObjectId("62218530055432e5a624ca66"), #文档id(唯一标识)
"files_id" : ObjectId("6221852f055432e5a624ca52"), # 文件id,与files中的id对应
"n" : 19, # 序号,从0开始
"data" : BinData (0,"N/zx9Mf98Z6e978L57.....")
}
files集合
{
"_id" : ObjectId("6221852f055432e5a624ca52"), #唯一标志
"length" : NumberLong(56019940), #文件大小(byte)
"chunkSize" : 261120, #chunk大小(byte)
"uploadDate" : ISODate("2022-03-04T03:19:37.978Z"), #上传时间
"filename" : "mongodb-database-tools-rhel70-x86_64-100.5.2.tgz", #文件名
"metadata" : {
}
}
GridFS操作
通过MongoDB提供的mongofiles工具,就可以直接对文档进行增加、删除、查询、修改操作
mongofiles工具包含5个命令:
- put:上传文件
- list:查看文件列表
- get:下载文件
- search:查找文件
- delete:删除文件
上传文件 put
mongofiles put <文件路径+文件名> --port <端口号> -u <账号> -p <密码> -d <数据库>
mongofiles put mongodb-database-tools-rhel70-x86_64-100.5.2.tgz --port 27017 --u test -ptest -d test
# 结果
2022-03-04T00:02:10.173-0800 connected to: localhost:27017
2022-03-04T00:02:10.174-0800 adding gridFile: mongodb-database-tools-rhel70-x86_64-100.5.2.tgz
查看文件列表 list
mongofiles list --port <端口号> -u <账号> -p <密码> -d <数据库> --authenticationDatabase <认证DB> --prefix <前缀名>
如果文件上传时使用--prefix参数指定了前缀名,则在查看或进行其他操作时也必须加上该前缀名
mongofiles list --port 27017 --u test -ptest -d test
# 结果
2022-03-03T23:51:48.894-0800 connected to: localhost:27017
mongodb-database-tools-rhel70-x86_64-100.5.2.tgz 56019940
下载文件 get
mongofiles get <文件名> -l <文件路径与新文件名> --port <端口号> -u <账号> -p <密码> -d <数据库> --authenticationDatabase <认证DB> --prefix <前缀名>
mongofiles get mongodb-database-tools-rhel70-x86_64-100.5.2.tgz -l /tmp/test.tgz --port 27017 --u test -ptest -d test
# 结果
2022-03-03T23:56:34.796-0800 connected to: localhost:27017
2022-03-03T23:57:22.308-0800 finished writing to /tmp/test.tgz
查找文件 search
mongofiles search <文件名> --port <端口号> -u <账号> -p <密码> -d <数据库> --authenticationDatabase <认证DB> --prefix <前缀名>
mongofiles search 'mon' --port 27017 --u test -ptest -d test
# 结果
2022-03-03T23:59:53.917-0800 connected to: localhost:27017
mongodb-database-tools-rhel70-x86_64-100.5.2.tgz 56019940
删除文件 delete
mongofiles delete <文件名> --port <端口号> -u <账号> -p <密码> -d <数据库> --authenticationDatabase <认证DB> --prefix <前缀名>
mongofiles delete mongodb-database-tools-rhel70-x86_64-100.5.2.tgz --port 27017 --u test -ptest -d test
#结果
2022-03-04T00:01:20.658-0800 connected to: localhost:27017
2022-03-04T00:01:20.956-0800 successfully deleted all instances of 'mongodb-database-tools-rhel70-x86_64-100.5.2.tgz' from GridFS
GridFS的其他参数
- --replace 在put时使用,用本地文件替换GridFS上存储的文件
- --quiet 安静模式,减少输出结果
- --host 指定要连接的MongoDB主机
- --prefix 集合前缀名