GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种:

存储巨大的文件,比如视频、高清图片等。

利用GridFS可以简化需求。

GridFS会直接利用已经建立的复制或分片机制,故障恢复和扩展都很容易

GridFS可以避免用户上传内容的文件系统出现问题。

GridFS不产生磁盘碎片。

GridFS使用两个表来存储数据:

fiiles包含元数据对象(如文件的名称、上传的时间)

chunks包含其他一些相关信息的二进制块

为了使度个GridF命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs。

所以任何默认的GridFS存储将包括命名空间fs.files和fs.chunks。(图片可以命名为ps.files和ps.chunks,视频可以命名为vs.files和vs.chunks)。

各种第三方语言可以更改其前缀。

本文是oschina的happyBKs的文章,请自己标明出处:http://my.oschina.net/u/1156339/blog/388156

使用GridFS mongofiles

mingofiles是从命令行操作GridFS的一种工具

三个命令:put(存储) get(取得) list(列表)

例如:我们将“testfile”这个文件存储到库中,具体做法是 ./mongofiles put testfile

首先,我们尝试压缩归档一个文件。

  1.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list
  2.  
    [sudo] password for neil: 
  3.  
     
  4.  
    connected to: 127.0.0.1
  5.  
    [neil@neilhost ~]$ tar zcf mongodbBook.tar.gz Downloads/MongoDB权威指南.pdf 
  6.  
    [neil@neilhost ~]$ ll mongodbBook.tar.gz 
  7.  
    -rw-rw-r--. 1 neil neil 203 3月  16 19:10 mongodbBook.tar.gz

下面我们将这个归档文件存储到mongoDB中。默认存放到test数据库中。

  1.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles put ./mongodbBook.tar.gz 
  2.  
    connected to: 127.0.0.1
  3.  
    added file: { _id: ObjectId('5506bc01581b37b38b49fecd'), filename: "./mongodbBook.tar.gz", chunkSize: 261120, uploadDate: new Date(1426504705885), md5: "85c0c93f51ebe9c609ffe4f9da71c63e", length: 203 }
  4.  
    done!
  5.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list
  6.  
    connected to: 127.0.0.1
  7.  
    ./mongodbBook.tar.gz 203
  8.  
    [neil@neilhost ~]$

之后,我们进入mongodb客户端查看test数据库,发现里面多了两个集合,一个是fs.files,查看之后发现里面记录着上传文件的以下像信息:文件名称、上传时间、md5码、文件长度、大小等。

fs.chunks查看显示二进制信息。

  1.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongo
  2.  
    [sudo] password for neil: 
  3.  
    MongoDB shell version: 2.6.8
  4.  
    connecting to: test
  5.  
    > show tables
  6.  
    fs.chunks
  7.  
    fs.files
  8.  
    system.indexes
  9.  
  10.  
  11.  
    > db.fs.files.find()
  12.  
    { "_id" : ObjectId("5506bc01581b37b38b49fecd"), "filename" : "./mongodbBook.tar.gz", "chunkSize" : 261120, "uploadDate" : ISODate("2015-03-16T11:18:25.885Z"), "md5" : "85c0c93f51ebe9c609ffe4f9da71c63e", "length" : 203 }
  13.  
    > db.fs.chunks.find()
  14.  
    { "_id" : ObjectId("5506bc011b359e376ad0011e"), "files_id" : ObjectId("5506bc01581b37b38b49fecd"), "n" : 0, "data" : BinData(0,"H4sIADm6BlUAA+3OvwsBcRjH8a+uZOE/kNuYuOO+btetMvkD1CHFnfzISgYDZqWU0d9g4w+x3W1mq7uUkmKgpN6v4Xnq+Tz1PJY7ctpuze7nyq7TdK2Sv5l6u4m/mHnLVbZrN8TntEDR0MKum/Kh30gp9LzUdFkIiwhSwzCFqn3h9lvD/qDWU1Xh1FvtV3vv8j+VmsdEfB+tCuV8iMSDwXF7qXQS5va+MTaV9SmZFpmf/QgAAAAAAAAAAAAAAAAAeHYFpzavuwAoAAA=") }
  15.  
    >

这个文件不大,所以二进制信息很短。

  1.  
    [neil@neilhost ~]$ du mongodbBook.tar.gz 
  2.  
    4 mongodbBook.tar.gz

接下来,我尝试将mongodbBook.tar.gz的原文件删除,然后从mongodb中获取恢复。

这里用到的是mongofiles get命令。这里注意的是

  1.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list
  2.  
    connected to: 127.0.0.1
  3.  
    ./mongodbBook.tar.gz 203
  4.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles get mongodbBook.tar.gz
  5.  
    connected to: 127.0.0.1
  6.  
    ERROR: file not found
  7.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles get ./mongodbBook.tar.gz
  8.  
    connected to: 127.0.0.1
  9.  
    done write to: ./mongodbBook.tar.gz
  10.  
    [neil@neilhost ~]$ ll
  11.  
    总用量 44
  12.  
    drwxr-xr-x. 2 neil neil 4096 2月  13 18:36 Desktop
  13.  
    drwxr-xr-x. 3 neil neil 4096 2月  13 21:35 Documents
  14.  
    drwxr-xr-x. 5 neil neil 4096 3月  15 21:56 Downloads
  15.  
    -rw-r--r--. 1 root root  203 3月  17 18:27 mongodbBook.tar.gz
  16.  
    drwxr-xr-x. 2 neil neil 4096 2月  13 18:36 Music
  17.  
    drwxr-xr-x. 3 neil neil 4096 3月  15 22:50 Pictures

这里需要注意的是,后面get的文件名称需要指定路径,这里要加上./,否则会显示文件不存在。

注意,这个./指的不是linux当前的路径,而是在Mongodb的文件存储中的路径。

之后,有put有get必有delete。

接下来看看如何删除MongoDB中的大文件.

  1.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list
  2.  
    [sudo] password for neil: 
  3.  
    connected to: 127.0.0.1
  4.  
    ./mongodbBook.tar.gz 203
  5.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles delete ./mongodbBook.tar.gz 
  6.  
    connected to: 127.0.0.1
  7.  
    done!
  8.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongofiles list
  9.  
    connected to: 127.0.0.1
  10.  
    [neil@neilhost ~]$ sudo /usr/local/mongodb/bin/mongo
  11.  
    MongoDB shell version: 2.6.8
  12.  
    connecting to: test
  13.  
    > db
  14.  
    test
  15.  
    > show collections
  16.  
    fs.chunks
  17.  
    fs.files
  18.  
    system.indexes
  19.  
    > db.fs.files.find()
  20.  
  21.  
    > db.fs.chunks.find()
  22.  
    >

删除之后可以看到fs.files中的元数据和fs.chunk中的二进制数据都没有了。

--------------------- 本文来自 Ghost丶 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/linux_hacher/article/details/79663911?utm_source=copy

GridFS大文件的添加、获取、查看、删除的更多相关文章

  1. Visual Studio 2015 自动生成 的大文件xxx.vc.db的删除问题

    用vs2015创建Visual C++项目,编写生成后,每次都会生成一个project_name.VC.db文件,而且会随着你工程修改运行变的越来越大. project_name.VC.db是sqli ...

  2. 删除Git记录里的大文件

    删除Git记录里的大文件 仓库自身的增长 大多数版本控制系统存储的是一组初始文件,以及每个文件随着时间的演进而逐步积累起来的差异:而 Git 则会把文件的每一个差异化版本都记录在案.这意味着,即使你只 ...

  3. 记一次删除Git记录中的大文件的过程

    app/test/target/ #查看大文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/ ...

  4. 利用Linux的硬连接删除MySQL大文件

    利用Linux的硬连接删除MySQL大文件 http://blog.csdn.net/wxliu1989/article/details/22895201 原理:硬链接基础当多个文件共同指向同一ino ...

  5. Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案

    此文章仅作为本人的笔记,文章转载自  http://blog.csdn.net/defonds/article/details/46042809 Nginx 做反向代理,后端是 tomcat,chro ...

  6. Linux大文件已删除,但df查看已使用的空间并未减少解决

    在我的生活当中遇到磁盘快满了,这时候准备去删除一些大文件 于是我使用ncdu 查看了一下当前系统占用资源比较多的是那些文件,结果一看是elasticsearch的日志文件,好吧,竟然找到源头了,那就把 ...

  7. 牛客网Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器

    不多说,直接上干货! 获取文件名称.获取文件路径.获取文件大小.获取文件修改时间 FileMethodDemo.java package zhouls.bigdata.DataFeatureSelec ...

  8. 如何安放你的大文件,MongoDB GridFS可以帮助你

    1 简介 众所周知(你不知也当你知),MongoDB是以文档(Document)组织数据的.除了常用于存储Json数据,它也是可以存储普通文件的.我们可以把一些文件以BSOON的格式存入MongoDB ...

  9. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 读取编码器信息Python2.7和Python3.3版本差异及解决,一次订阅多次调用callback的解决

    1. Python3.3以字节类型返回编码器信息,b'...',BUF: b'\xc3KOO\x00OO\x00OO\x00OO\x00OO\x00\x03\x00\x00\x00\x00\x99R\ ...

  2. CentOS6、CentOS7配置Base源和epel源

    1.用yum安装软件报错 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&a ...

  3. 2019年春招Android方向腾讯电话面试

    第一问:TCP与UDP的区别 参考答案: 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少: 3.UDP程序结构较简单 4.流模式(TCP)与数据报模式(UDP); 5.TCP保证数据正确 ...

  4. iOS App 项目:会员卡管理系统设计方案

    1.需求描写叙述 店主须要管理自己的会员信息和充值卡信息以及消费纪录 店主觉得购买电脑和外设成本太高,并且店面没有地方容纳这些设备 店主希望通过手机来完毕这些功能.但尽量不产生流量.对网络要求较低 店 ...

  5. J粒子发现40周年-丁肇中中科院讲座笔记

    J粒子发现40周年-丁肇中中科院讲座笔记 华清远见2014-10-18   北京海淀区  张俊浩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVuZm ...

  6. ubuntu compile php from source code

    10down vote Assuming that you already have the OpenSSL libraries and header files (on rpm systems th ...

  7. Linux下Tomcat VM參数改动

    不可行的方法 最初我直接改动catalina.sh, 将JAVA_OPTS变量加上了 -server -Xms1G -Xmx1G -XX:+UserG1GC 最初看起来没啥问题,可是当服务器运行几天后 ...

  8. PAT 1003 Sharing (25)

    题目描写叙述 To store English words, one method is to use linked lists and store a word letter by letter. ...

  9. 分享一个ci 框架下取不到cookie的问题

    由于项目中用到了网银支付,在360极速浏览器和其它双核浏览器中,当跳转到付款时他们会强制的把浏览器的模式改为兼容模式,这样一来在极速模式下的cookie在兼容模式下取不到,因为浏览器切换模式的时候us ...

  10. UVa567_Risk(最短路)(小白书图论专题)

    解题报告 option=com_onlinejudge&Itemid=8&category=7&page=show_problem&problem=508"& ...