浅尝辄止MongoDB:GridFS
一、为什么使用GridFS
GridFS是MongoDB的一个子模块,使用GridFS可以基于MongoDB来持久存储文件,并且支持分布式应用(文件分布存储和读取)。作为MongoDB中二进制数据存储在数据库中的解决方案,通常用来处理大文件,对于MongoDB的BSON格式的数据(文档)存储有尺寸限制,最大为16M。但是在实际系统开发中,上传的图片或者文件可能尺寸会很大,此时我们可以借用GridFS来辅助管理这些文件。
GridFS不是MongoDB自身特性,只是一种将大型文件存储在MongoDB的文件规范,所有官方支持的驱动均实现了GridFS规范。GridFS制定大文件在数据库中如何处理,通过开发语言驱动来完成、通过API接口来存储检索大文件。
GridFS的主要特性可以简单归纳为:
- 用MongoDB存储大文件。
- 突破MongoDB单个文档最大16MB的限制。
- 可以访问部分文件,而不用向内存中加载全部文件,从而保持高性能。
- 文件和元数据自动同步。
二、GridFS存储原理
http://rdc.hundsun.com/portal/article/703.html
三、使用GridFS
1. 准备测试文件
cat /usr/share/dict/words > /tmp/dictionary
2. 查看MongoDB中的文件
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin list
2018-09-29T09:47:04.391+0800 connected to: localhost
[mongodb@hdp4~]$
list命令将列出数据库中的所有文件,当前数据库中没有任何文件。mongofiles是一个概念验证工具,主要用于学习和测试,而不应该在自己的应用中使用。
3. 将词典文件添加到数据库
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin put /tmp/dictionary
2018-09-29T09:52:27.928+0800 connected to: localhost
2018-09-29T09:52:28.059+0800 added file: /tmp/dictionary[mongodb@hdp4~]$
4. 再次查看MongoDB中的文件
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin list
2018-09-29T09:53:36.372+0800 connected to: localhost
/tmp/dictionary 4953680
[mongodb@hdp4~]$
返回了词典文件及其大小,这些信息来自于files集合。MongoDB将文件拆分为块存储,默认的块大小为256K,可通过chunksize参数修改,但不能超过16MB的限制。put命令的返回信息中还包括文件上传时间戳,存储该文件在MongoDB中的创建时间。
5. 存储重名文件
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin put /tmp/dictionary
2018-09-29T09:58:59.894+0800 connected to: localhost
2018-09-29T09:58:59.976+0800 added file: /tmp/dictionary[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin list
2018-09-29T09:59:03.918+0800 connected to: localhost
/tmp/dictionary 4953680
/tmp/dictionary 4953680
[mongodb@hdp4~]$
再put一遍同一文件,MongoDB中存储了两个同样的文件,它们的元数据一致,除了_id键。MongoDB提供了md5哈希算法,但GridFs不会自动处理md5值相同的文件。也就是说,同一个文件进行两次put命令,将会在GridFS中对应两个不同的存储,对于存储来说,这是一种浪费。对于md5相同的文件,如果想要在GridFS中只有一个存储,需要通过API进行扩展处理。
6. 在MongoDB中查看数据
> use test;
switched to db test
> show collections;
fs.chunks
fs.files
> db.fs.files.find();
{ "_id" : ObjectId("5baee3102785bf92e10d44cb"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-09-29T02:27:29.073Z"), "length" : 4953680, "md5" : "15a189ff6eacf1796d56e2156d48d69a", "filename" : "/tmp/dictionary" }
{ "_id" : ObjectId("5baee3122785bf92ec0c8f6f"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-09-29T02:27:30.540Z"), "length" : 4953680, "md5" : "15a189ff6eacf1796d56e2156d48d69a", "filename" : "/tmp/dictionary" }
> db.fs.chunks.find({},{"data":0});
{ "_id" : ObjectId("5baee3102785bf92e10d44cc"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 0 }
{ "_id" : ObjectId("5baee3102785bf92e10d44cf"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 3 }
{ "_id" : ObjectId("5baee3102785bf92e10d44cd"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 1 }
{ "_id" : ObjectId("5baee3102785bf92e10d44ce"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 2 }
{ "_id" : ObjectId("5baee3102785bf92e10d44d0"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 4 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d1"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 5 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d2"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 6 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d3"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 7 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d4"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 8 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d5"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 9 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d6"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 10 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d7"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 11 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d8"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 12 }
{ "_id" : ObjectId("5baee3112785bf92e10d44d9"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 13 }
{ "_id" : ObjectId("5baee3112785bf92e10d44da"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 14 }
{ "_id" : ObjectId("5baee3112785bf92e10d44db"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 15 }
{ "_id" : ObjectId("5baee3112785bf92e10d44dc"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 16 }
{ "_id" : ObjectId("5baee3112785bf92e10d44dd"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 17 }
{ "_id" : ObjectId("5baee3112785bf92e10d44de"), "files_id" : ObjectId("5baee3102785bf92e10d44cb"), "n" : 18 }
{ "_id" : ObjectId("5baee3122785bf92ec0c8f70"), "files_id" : ObjectId("5baee3122785bf92ec0c8f6f"), "n" : 0 }
Type "it" for more
>
数据存储在test数据库中,在该数据库中生成了fs.files和fs.chunks两个集合。files存储文件元数据信息,chunks存储文件中的数据。7. 使用搜索命令
(1)上传一个新文件
[mongodb@hdp4~]$cp /tmp/dictionary /tmp/hello_world
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin put /tmp/hello_world
2018-09-29T10:33:15.332+0800 connected to: localhost
2018-09-29T10:33:15.484+0800 added file: /tmp/hello_world[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin list
2018-09-29T10:33:26.149+0800 connected to: localhost
/tmp/dictionary 4953680
/tmp/dictionary 4953680
/tmp/hello_world 4953680
[mongodb@hdp4~]$
(2)用search命令搜索文件名
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin search hell
2018-09-29T10:35:07.059+0800 connected to: localhost
/tmp/hello_world 4953680
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin search ict
2018-09-29T10:35:13.385+0800 connected to: localhost
/tmp/dictionary 4953680
/tmp/dictionary 4953680
[mongodb@hdp4~]$
8. 删除MongoDB中的文件
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin delete /tmp/dictionary
2018-09-29T10:37:38.140+0800 connected to: localhost
2018-09-29T10:37:38.186+0800 successfully deleted all instances of '/tmp/dictionary' from GridFS[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin list
2018-09-29T10:37:40.884+0800 connected to: localhost
/tmp/hello_world 4953680
[mongodb@hdp4~]$
使用delete命令有两点需要注意:
- 该命令基于文件名删除文件,因此将删除所有同名文件。
- MongoDB不会释放已经占用的硬盘空间。即使删除db中的集合MongoDB也不会释放磁盘空间。同样,如果使用GridFS存储文件,从GridFS存储中删除无用的垃圾文件,MongoDB依然不会释放磁盘空间的。这会造成磁盘一直在消耗,而无法回收利用的问题。
此时数据库中只存储了/tmp/hello_world一个文件:
> use test
switched to db test
> show collections;
fs.chunks
fs.files
> db.fs.files.find();
{ "_id" : ObjectId("5baee46b2785bf94c31b08ff"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-09-29T02:33:15.505Z"), "length" : 4953680, "md5" : "15a189ff6eacf1796d56e2156d48d69a", "filename" : "/tmp/hello_world" }
>
9 从MongoDB中获取文件
[mongodb@hdp4~]$mongofiles -u "wxy" -p "rockey" --authenticationDatabase admin get /tmp/hello_world
2018-09-29T10:46:04.095+0800 connected to: localhost
2018-09-29T10:46:04.211+0800 finished writing to /tmp/hello_world[mongodb@hdp4~]$
该例故意包含了一个错误。因为指定了希望读取文件的绝对文件名,mongofiles将把数据写入到含有相同名字和路径的文件中。事实上,该命令将复写原始的/tmp/hello_world文件。
浅尝辄止MongoDB:GridFS相关推荐
- MongoDB GridFS——本质上是将一个文件分割为大小为256KB的chunks 每个chunk里会放md5标识 取文件的时候会将这些chunks合并为一个整体返回...
MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中 ...
- MongoDB GridFS 存储文件
使用MongoDB的GridFS方式. CSDN: https://blog.csdn.net/qq_32657967/article/details/81534259 官方文档: https://d ...
- 一文说通Dotnet操作MongoDB GridFS
补个技术债. 这个主题一直在列表中,今天把它补上.还有一个原因,就是网上能查到的代码,大多已经过期了.今天写的,是按最新的SDK做的例子. 一.MongoDB GridFS 先说说 GridF ...
- 从MongoDB GridFS流式传输文件
不久前,我在Twitter上发布了自己的最新作品,即从MongoDB GridFS传输文件进行下载(而不是将整个文件存储到内存中然后提供服务),这是我取得的一个小胜利. 我答应就此事写博客,但不幸的是 ...
- PHP操作MongoDB GridFS 存储文件
PHP操作MongoDB GridFS 存储文件,如图片文件 我的测试代码: 1.前端上传文件html index.html <!DOCTYPE html PUBLIC "-//W3C ...
- Python 分布式文件系统 Mongodb GridFS
Python 分布式文件系统 Mongodb GridFS~~~~ 抽时间关注下~~~ 转载于:https://www.cnblogs.com/macula7/archive/2010/03/31/1 ...
- MongoDB——GridFS
MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中 ...
- SpringBoot+MongoDB GridFS文件上传、下载、预览实战
SpringBoot + MongoDB GridFS 随着web 3.0的兴起,数据的形式不局限于文字,还有语音.视频.图片等.高效存储与检索二进制数据也成为web 3.0必须要考虑的问题.然而这种 ...
- Python+Streamlit aggrid+MongoDB GridFS构建低代码文档管理应用(文档查询下载实用篇)
1. Sreamlit aggrid简介 Sreamlit aggrid是Streamlit的Ag-Grid组件的实现,在Python Streamlit框架下,更加灵活的使用表格,包括分组.排序.编 ...
- mongodb gridfs java_mongodb gridfs基本使用
Mongodb GridFS图片文件存储解决方案 之前解决方案是接收图片数据后,将图片直接存储到盘阵,然后通过Apache做服务器,将图片信息存储到数据库,并且存储一个Apache的访问路径. 目前需 ...
最新文章
- Google小组研发模式分析
- 中事件源previous_PM2.5传感器在扬尘监测系统中的应用
- 【微分方程数值解】常\偏微分方程及其常用数值解法概述
- 高中生入门计算机编程,高中生必看:入门学软件编程,看这三点...
- 车辆属性识别、车型识别
- 1.84亿月活换来400亿港元估值,网易云音乐的钱途在哪儿?
- 信号降噪方法——基于自适应神经模糊推理系统(ANFIS)的降噪处理
- 小于n的最大素数python_求m下n个最大素数
- Google Maven Replacer Plugin插件详解
- 蚂蚁金融NLP竞赛——文本语义相似度赛题总结
- android 网络编程 注册登录,android网络编程_自寻址套接字DatagramPacket
- Camtasia Studio 录制视频保存为camrec格式后快速导出为AVI格式
- 力扣-进店却未进行过交易的顾客
- Linux下批量把GDK编码的文章转化为UTF-8编码的文章以及“iconv: 未知 xxx 处的非法输入序列”错误处理
- Lineage17OS 中的一些定制及方法
- 类似 marquee 的图片左右滑动且无缝对接
- 如何看待 30 岁转行做程序员这件事
- python—数据分析(二)
- EI会议推荐合集(3、4、5月)
- 电脑垃圾清理 -windows电脑裸奔必知技巧