document的大小超过16M是使用GridFS的条件之一,因为mongodb普通的collection无法支持16M以上的document
GridFS使用2个collections来存储这些文件 fs.files与fs.chunks
一个collection存储文件的chunks(实际文件数据)
一个则存储文件的metadata(用户自定义的属性,filename,content-type等)。
fs.files集合信息如下:
{
"_id" : ObjectId("4f4608844f9b855c6c35e298"), //唯一id,可以是用户自定义的类型
"filename" : "CPU.txt", //文件名
"length" : 778, //文件长度
"chunkSize" : 262144, //chunk的大小
"uploadDate" : ISODate("2012-02-23T09:36:04.593Z"), //上传时间
"md5" : "e2c789b036cfb3b848ae39a24e795ca6", //文件的md5值
"contentType" : "text/plain" //文件的MIME类型
"meta" : null //文件的其它信息,默认是没有”meta”这个key,用户可以自己定义为任意BSON对象
}
fs.chunks的代码如下:
{
"_id" : ObjectId("4f4608844f9b855c6c35e299"), //chunk的id
"files_id" : ObjectId("4f4608844f9b855c6c35e298"), //文件的id,对应fs.files中的对象,相当于fs.files集合的外键
"n" : 0, //文件的第几个chunk块,如果文件大于chunksize的话,会被分割成多个chunk块
"data" : BinData(0,"QGV...") //文件的二进制数据,这里省略了具体内容
}
执行 mongosh
然后执行:
1.对fs01库开启分片功能
use admin
db.runCommand({enablesharding:"fs01"});
#执行成功会返回{"ok" 1 ......}
2建立hash索引
use fs01
db.fs.chunks.ensureIndex({files_id:"hashed"})
#执行成功会返回 [ 'files_id_hashed' ]
3进行分片
sh.shardCollection("fs01.fs.chunks", {files_id:"hashed"})
原理是对GridFS的 fs.chunks集合进行哈希分片,片键是files_id。每一个文件的不同块的files_id都是相同的