参照官网如下(如下链接依次递进):

https://docs.mongodb.com/manual/core/gridfs/
https://docs.mongodb.com/database-tools/mongofiles/#mongodb-binary-bin.mongofiles
https://docs.mongodb.com/database-tools/installation/installation/

FS:即文件系统(File System)。

GridFS简介。

      MongoDB中的文档(数据)是以BSON格式存储的,由于BSON的限制只能存储16M以下的数据;为了应对这个问题Mongodb提供了GridFS子模块,他可以存储大于16M的文件。GridFS是一种将大型文件存储在MongoDB的文件规范。所有官方支持的驱动均实现了GridFS规范。

注:实际上小于16M的可以直接用MongoDB的bson存就好了,大于16M的才需要借助Gridfs。

        GridFS使用两个集合来存储文件:fs.files与fs.chunks。其中fs.files集合存放文件的信息,fs.chunks存放文件的数据。GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk作为Mongodb的一个文档存储在chunks集合中。

mongofiles工具

        mongofiles可执行程序提供了命令行操作存储在GridFS对象中MongoDB实例中的文件,它提供了存储在文件系统中的对象和GridFS之间的接口。由官网知道从MongoDB4.4开始,mongofiles现在与MongoDB服务器分开发布,并使用自己的版本控制,初始版本为100.0.0。以前,mongofiles与MongoDB服务器一起发布,并使用匹配的版本控制。关于工具的安装,参见官网即可。

mongofiles的使用方法主要参见 --help,如下:

 为了方便使用这里专门提供两条实例命令行语句:

./mongofiles --uri='mongodb://mongouser:qidian%40weixin@11.186.6.xxx:27017' --db db_shuozhuo put service.yaml

./mongofiles --host 11.186.6.xxx:27017 -u mongouser -p wexin@mongo -d db_shuozhuo put build_vs_env.sh

验证上传是否成功的方法也很简单。一是看执行后的输出,二看目标db是否有对应的条目。如下图可以看到两个集合实际上都存了什么东西。

一些思考。

        虽然gridfs可以存文件意味着业务可以不用额外引入其他文件存储(如cos)、另外还有易于横向扩展等优点。但个人感觉gridfs这东西不是很实用。首先是成本方面。对于图片、文件直接用专门的 对象存储(cos)更专业的同时成本还低,用数据库显得不是那么自然。另外就是性能方面。从mongodb访问文件比直接从文件系统访问文件速度慢(中间层开销)。此外如果要修改GridFs上的文档必须要先删除在整个重新保存。

看了下网上其他人也有类似的观点:这里  如果做文件系统的话最好用专业的。比如TFS(Taobao File System,针对大量随机访问小图片)、FastDFS、mooseFS等。

        当然对于玩耍类的小项目应该还是有意义的,例如只用MongoDB一款数据库即能存消息、也能存文件、还能充当redis,一个数据库就能满足所有需求,简化工程代码、大大降低同各种存储打交道的成本。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐