GridFS

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: 文件名

你可能感兴趣的:(GridFS)