Mongodb GridFS文件系统
Mongodb gridfs文件系统通过files与chunks 2个集合来保存文件,其中files集合保存每个文件的元数据(包括每个文件被分割成了多少) ,
chunks集合具体保存每个文件相应的数据chunk,大于256kb的文件被分割为多个chunk,每个chunk最大保存256kb的数据(其实可以手动设置chunkSize,但貌似最大不能大于3M左右)
写文件:
默认将整个文件拆为256Kb为单位的二进制字节数组——>再save到每个chunk中----->最后再保存files集合元数据
java里面调用GridFSInputFile ifile=gridFS.createFile(f)方法会把db.fs.files集合中元数据各个参数初始化好,比如_id、chunkSize(默认256KB)、filename等
写文件源码就不多分享了,挺简单的,大家可以去看源码,大致就是上面那个流程
读文件:
先看下2个集合的数据结构
switched to db category hd1:PRIMARY> db.fs.files.findOne() { "_id" : ObjectId("514ae50bf211487e93102dd3"), "chunkSize" : NumberLong(262144), //每个chunk保存的数据大小(字节) "length" : NumberLong(1305), "md5" : "38ad64863784c3cb5d70a60d07e3bf23",//文件的md5校验值 "filename" : "reference.xml",//文件名 "contentType" : null,//文件类型 "uploadDate" : ISODate("2013-03-21T10:46:35.863Z"), "aliases" : null } hd1:PRIMARY> db.fs.chunks.findOne() { "_id" : ObjectId("514ae50bf211487e93102dd4"), "files_id" : ObjectId("514ae50bf211487e93102dd3"),//对应files集合中的_id "n" : 0,//第几个chunk "data" : BinData(0,”...这里是二进制数据,省略n字”) }
Java里面查询:
GridFS gridFS = new GridFS(db); BasicDBObject query = new BasicDBObject(); query.put("filename","reference.xml"); // 返回该文件对应的元数据信息 GridFSDBFile fs = gridFS.findOne(query); // 将数据写入本地文件 fs.writeTo(new File("d:/reference.xml.xml"));
java源码剖析:
1:gridFS.findOne(query):
public GridFSDBFile findOne( DBObject query ){ //_filesCollection会在初始化GridFS类的构造函数中进行赋值, //如:_filesCollection = _db.getCollection( _bucketName + ".files" ); return _fix( _filesCollection.findOne( query ) ); }
2:再看 fs.writeTo(...)方法:
所有的writeTo方法最终都会去调用writeTo( OutputStream out )方法,接下来咱们就去看此方法的逻辑:
public long writeTo( OutputStream out ) throws IOException { //计算该文件的chunk数量 final int nc = numChunks(); for ( int i=0; i<nc; i++ ){ //正真去获取数据:获取每个chunk的二进制数据,并写入到out流 out.write( getChunk( i ) ); } return _length; }
3:再看numChunks方法:
public int numChunks(){ //此处的的_length就是db.fs.files.findOne()结果中的length double d = _length; //然后与_chunkSize=262144注:(256k=262144字节)进行运算 d = d / _chunkSize; //最后向上取整,这样就得到一个文件存了多少份chunk return (int)Math.ceil( d ); }
4:再看getChunk()方法:
byte[] getChunk( int i ){ if ( _fs == null ) throw new RuntimeException( "no gridfs!" ); //获取具体的chunk上的数据,files_id对应该文件在files集合中的_id,n表示在第几个chunk上 DBObject chunk = _fs._chunkCollection.findOne( BasicDBObjectBuilder.start( "files_id" , _id ).add( "n" , i ).get()); if ( chunk == null ) throw new MongoException( "can't find a chunk! file id: " + _id + " chunk: " + i ); return (byte[])chunk.get( "data" ); }
这就是mongodb读取文件时候的相关流程
相关推荐
mongodb 所需jar包及gridfs java示例代码
Laravel开发-laravel-gridfs-storage 用于Laravel存储API的MongoDB GridFS集成
Java 操作Mongodb中存储的文件的实例
使用 Mongoose 以简单的语法将大型文档存储在 MongoDB 数据库中。 这个项目应该只与生成器重的项目一起使用,比如 Koa 项目。 此项目仅适用于 Node > 0.11。 安装 你可以通过 NPM 下载这个插件。 npm install ...
gridfs2s3 - 将 MongoDB GridFS 文件迁移到 AWS S3 的工具 这是一个简单的工具,它将抓取您指向的 GridFS 中的所有文件,并将它们粘贴到 S3 中 安装 go install github.com/Bowbaq/gridfs2s3 用法 gridfs2s3 -h flag...
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。 MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。 MongoDB支持...
MongoDB.GridFS.dll c#类库...............................................
我正在尝试从GridFS读取3种不同的部署(不同的MongoDB驱动程序)。 并将结果与经典的Nginx配置进行比较。贡献者( ) ( )构型1,Nginx location /files/ { alias /home/ubuntu/;}测试期间, open_file_cache...
nodejs-mongodb-multer-fileupload 使用multer,gridfs,mongodb / mongoose的Node.js文件上传系统
NULL 博文链接:https://shift-alt-ctrl.iteye.com/blog/2195646
Mongodb的gridfs的C#的例子
基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,...
nginx+gridfs存储及查看图片方案,适用于centos7的mongdb 3.0.15版本的安装包
使用JWT身份验证ReactPython MongoDB CRUD应用程序该应用程序是使用python作为后端的简单CRUD应用程序。 它还提供了使用Python中的GridFS上传和下载图像的功能。安装说明使用npm软件包管理器从客户端文件夹中存在的...
Mongodb基于GridFS存储文件,通过流的方式存储文件图片,以及读取功能。本人亲自测试、编写。值得信赖
Multer的GridFS存储引擎 存储引擎,用于将上传的文件直接存储到MongoDb。 :fire: 产品特点与MongoDb... :rocket: 安装使用npm $ npm install multer-gridfs-storage --save 基本用法示例: const express = require
功能:基于mongodb gridfs实现简单文件上传、下载、搜索、删除。 开发环境:VS2012 mongodb驱动:官方Driver 上传控件:jquery uploadify 疑问:sort()方法可能有点问题 PS:有问题可以留言,欢迎交流~
第1章 初识MongoDB.pptx 第2章 MongoDB的结构.pptx ...第9章 MongoDB的大文件存储规范GridFS.pptx 第10章 MongoDB的分布式运算模型MapReduce.pptx 第11章 MongoDB存储原理.pptx 第12章 MongoDB副本集部署.pptx
主要介绍了MongoDB学习笔记之GridFS使用介绍,本文介绍了GridFS的作用、GridFS的一些使用方法、GridFS实现原理及注意事项等,需要的朋友可以参考下
Laravel开发-gridfs 使用laravel上的gridfs存储文件、图像和文档