0
点赞
收藏
分享

微信扫一扫

和我一起学MongoDB(十六)MongoDB大文件存储-GridFS

千白莫 2022-03-11 阅读 84

@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._idfs.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 集合前缀名
举报

相关推荐

0 条评论