zoukankan      html  css  js  c++  java
  • 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”为前缀的文件

  • 相关阅读:
    idea设置全局ignore
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistributable. Please ins
    win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistr
    kafka 删除 topic
    java编译中出现了Exception in thread “main" java.lang.UnsupportedClassVersionError
    Centos中使用yum安装java时,没有jps的问题的解决
    Spring 整合Junit
    Spring纯注解配置
    Spring 基于注解的 IOC 配置
    打印java系统的信息
  • 原文地址:https://www.cnblogs.com/tomcatx/p/4245554.html
Copyright © 2011-2022 走看看