GridFS是一种在MongoDB中存储大二进制文件的机制。使用GridFS存文件有一下优势:
- GridFS会直接利用已经建立的复制或分片机制,所以对于文件存储来说故障恢复和拓展都很容易
- 避免用于存储用户上传内容的文件系统出现某些问题。比如,GridFS在同一个目录下放置大量的文件没有任何问题
- GridFS不产生磁盘碎片,因为MongoDB分配数据文件空间时以2GB为一块
- GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
- GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。
- 每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中
- 如果你希望访问一个超大的文件,而不希望将它全部加入内存,而是有“range access”的情况,即分段读取,那么GridFS天生就具备这种能力,你可以随意访问任意片段。
➜ ~ echo "hello world" > foo.txt
➜ ~ mongofiles put foo.txt
> db.getCollectionNames()
[ "fs.chunks", "fs.files", "my_collection" ]
> db['fs.chunks'].find()
{
"_id" : ObjectId("595a6cc382cd540c2284e44a"),
"files_id" : ObjectId("595a6cc382cd540c2284e449"),
"n" : 0,
"data" : BinData(0,"aGVsbG8gd29ybGQK")
}
>
- _id: 块id
- file_id: 该块所属的文件id
- n: 块编号
- data: 包含组成文件块的二进制数据
> db['fs.files'].find()
{
"_id" : ObjectId("595a6cc382cd540c2284e449"),
"chunkSize" : 261120,
"uploadDate" : ISODate("2017-07-03T16:11:47.778Z"),
"length" : 12,
"md5" : "6f5902ac237024bdd0c176cb93063dc4",
"filename" : "foo.txt"
}
>
- id: 文件id
- uploadDate: 文件存入GridFS的时间戳
- chunkSize: 每个块的大小,默认256K
- length: 文件内容总的字节数
- md5: 文件内容的md5校验和
- filename: 文件名