• MongoDB整理笔记のGridFS


        GridFS 是一种将大型文件存储在MongoDB 数据库中的文件规范。所有官方支持的驱动均实现了GridFS 规范。

        GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。

       官网学习:

        http://www.mongodb.org/display/DOCS/GridFS

        http://www.mongodb.org/display/DOCS/GridFS+Specification

         1、为什么要用GridFS

        由于MongoDB 中BSON 对象大小是有限制的,所以GridFS 规范提供了一种透明的机制,可以将一个大文件分割成为多个较小的文档,这样的机制允许我们有效的保存大文件对象,特别对于那些巨大的文件,比如视频、高清图片等。

        2、如何实现海量存储

        为实现这点,该规范指定了一个将文件分块的标准。每个文件都将在文件集合对象中保存一个元数据对象,一个或多个chunk 块对象可被组合保存在一个chunk 块集合中。大多数情况下,你无需了解此规范中细节,而可将注意力放在各个语言版本的驱动中有关GridFS API 的部分或是如何使用mongofiles 工具上。

        3、语言支持

        GridFS 对Java, Perl, PHP, Python, Ruby 等程序语言均支持,且提供了良好的API 接口。

        4、简单介绍

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

        files 包含元数据对象

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

        为了使多个GridFS 命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的GridFS 存储将包括命名空间fs.files 和fs.chunks。各种第三方语言的驱动有权限改变这个前缀,所以你可以尝试设置另一个GridFS 命名空间用于存储照片,它的具体位置为:photos.files 和photos.chunks。下面我们看一下实际的例子吧。

        5、命令行工具

    mongofiles 是从命令行操作GridFS 的一种工具,例如我们将”testfile”这个文件存到库里面,具体用法如下:
        [root@localhost bin]# ./mongofiles put testfile
        connected to: 127.0.0.1
        added file: { _id: ObjectId('4fc60175c714c5d960fff76a'), filename: "testfile", chunkSize: 262144,
        uploadDate: new Date(1338376565745), md5: "8addbeb77789ae6b2cb75deee30faf1a", length:
        16 }
        done!

        下面我们查一下看库里有哪些GridFS 文件,在”mongofiles”后加一个参数”list”即可

    [root@localhost bin]# ./mongofiles list
        connected to: 127.0.0.1
        testfile 16

        接下来我们进库里看一下是否有新的东西

     [root@localhost bin]# ./mongo
        MongoDB shell version: 1.8.1
        connecting to: test
        > show collections
        fs.chunks --上文提到的fs.chunks
        fs.files --上文提到的fs.files
        system.indexes
        system.js
        >

        我们继续查看fs.files 中的内容

    > db.fs.files.find()
        { "_id" : ObjectId("4fc60175c714c5d960fff76a"), "filename" : "testfile", "chunkSize" : 262144,
        "uploadDate" : ISODate("2012-05-30T11:16:05.745Z"), "md5" :
        "8addbeb77789ae6b2cb75deee30faf1a", "length" : 16 }

        字段说明:
        Filename: 存储的文件名
        chunkSize: chunks 分块的大小
        uploadDate: 入库时间
        md5: 此文件的md5 码
        length: 文件大小, 单位”字节”
        看来fs.files 中存储的是一些基础的元数据信息
        我们继续查看fs.chunks 中的内容 

    > db.fs.chunks.find()
        { "_id" : ObjectId("4fc60175cf1154905d949336"), "files_id" :
        ObjectId("4fc60175c714c5d960fff76a"), "n" : 0, "data" :
        BinData(0,"SGVyZSBpcyBCZWlqaW5nCg==") }

        其中比较重要的字段是”n”,它代表的是chunks 的序号,此序号从0 开始,看来fs.chunks中存储的是一些实际的内容数据信息
        我们即然能将此文件存进去,我们就应该有办法将其取出来,下面看一下实例:

     [root@localhost bin]# rm testfile
        rm:是否删除 一般文件 “testfile”? y --先删文件
        [root@localhost bin]# ./mongofiles get testfile --将其从库里取出来
        connected to: 127.0.0.1
        done write to: testfile
        [root@localhost bin]# md5sum testfile --校验md5,结果跟库里相同
        8addbeb77789ae6b2cb75deee30faf1a testfile
        [root@localhost bin]#

        6、索引

    db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});

        这样,一个块就可以利用它的files_id 和 n 的值进行检索。注意,GridFS 仍然可以用findOne得到第一个块,如下:

    db.fs.chunks.findOne({files_id: myFileID, n: 0});

        7、应用

        MongoDB提供了一个命令行工具mongofiles可以来处理GridFS,在bin目录下。
        列出所有文件:
        mongofiles list
        上传一个文件:
        mongofiles put xxx.txt
       下载一个文件:
        mongofiles get xxx.txt
        查找文件:
        mongofiles search xxx    //会查找所有文件名中包含“xxx”的文件
        mongofiles list xxx //会查找所有文件名以“xxx”为前缀的文件

  • 相关阅读:
    vue开发(一)安装
    Ubuntu18.04安装mysql
    使用.NET Framework开发IIS 7.0模块和处理程序拦截请求实现跳转
    Mysql 清空数据后,释放硬盘文件
    依赖注入
    ubuntu 上开发.netcore
    使用python获取微医数据
    Mysql查询某字段重复值并删除重复值
    使用pyinstaller 打包python程序
    堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出
  • 原文地址:https://www.cnblogs.com/tomcatx/p/4245554.html
Copyright © 2020-2023  润新知