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异步驱动程序(mongodb-async-driver)是为Java开发者设计的一个库,它允许应用程序以非阻塞的方式与MongoDB服务器进行通信,提高了处理大量并发请求的能力。 在"mongodb-async-driver-2.0.1.jar"这个特定...
官方 MongoDB Java 驱动程序提供与 MongoDB 的同步和异步交互。An updated Java driver that includes the legacy API as well as a new generic MongoCollection interface that complies with a new cross-driver ...
4. mongoexport.exe:与mongoimport相反,它能将MongoDB数据导出为JSON、CSV或TSV格式的文件,便于数据分析或者在不同系统间转移数据。 5. mongofiles.exe:这是一个用于管理和操作MongoDB GridFS文件系统的命令行...
在这个Java操作MongoDB中存储的文件实例中,我们将探讨如何利用GridFS API进行文件的存取。 首先,我们需要在Java项目中引入MongoDB的驱动库。目前,Java驱动通常使用的是MongoDB Java Driver,可以在Maven仓库中...
Java是开发MongoDB应用的常见语言之一,因为Java有丰富的驱动程序支持,其中就包括了MongoDB的Java驱动。在本主题中,我们将深入探讨MongoDB的Java开发所需jar包以及如何使用GridFS进行文件存储。 首先,MongoDB的...
- **GridFS**:MongoDB的GridFS功能用于存储和检索大型文件,如图像或视频。 - **地理空间索引**:支持地理位置数据的索引和查询,适用于地理定位应用。 总之,"mongodb-linux-i686-3.2.20"是一个针对32位Linux...
5. **mongofiles**:用于管理和操作MongoDB的GridFS文件存储系统的工具。 要运行这个MongoDB实例,你需要完成以下步骤: 1. 解压文件到一个适当的目录,例如`/opt/mongodb`。 2. 创建一个数据目录,如`/data/db`,...
MongoDB是一款分布式文档型数据库,被广泛应用于现代应用程序开发中,尤其在大数据、实时分析、内容管理和物联网(IoT)等场景下表现出色。标题"mongodb-windows-x86_64-5.0.6-signed.zip"表明我们讨论的是MongoDB的...
5. GridFS:MongoDB内置了GridFS,这是一个用于存储和检索大型文件的规范,它将大文件分割成多个小块并存储在数据库中,方便高效访问。 6. 自动备份与恢复:MongoDB提供了工具进行数据备份和恢复,这对于灾难恢复和...
MongoDB 是一个高性能、开源、无模式的分布式文档数据库,被广泛用于开发现代应用程序,特别是那些需要处理大量数据和实时查询的应用。MongoDB 5.0.1 版本是针对Linux x86_64架构,特别是RHEL 7.0 (Red Hat ...
`laravel-gridfs-storage`扩展使得开发者能够在Laravel应用中充分利用MongoDB的GridFS特性。 首先,让我们了解Laravel的存储服务。Laravel提供了一个强大的抽象层,允许开发者在多种存储驱动之间切换,如本地、S3、...
MongoDB Java驱动是Java开发者与MongoDB数据库交互的重要工具,它允许Java应用程序通过标准的Java API来执行查询、插入、更新和删除等操作。在Java中使用MongoDB,首先需要安装并配置对应的驱动版本,以确保与正在...
MongoDB是一种流行的开源、分布式文档数据库,常用于处理大规模数据。在Linux环境下,特别是RHEL (Red Hat...在管理MongoDB时,确保定期更新,应用安全最佳实践,包括设置用户权限、监控性能和日志,以及定期备份数据。
首先,我们来看看`mongodb-mongo-java-driver-45aa1c0`这个文件名。这个版本号`45aa1c0`通常代表的是Git仓库中的一个特定提交哈希值,它标识了源码的某个具体版本。通过这个哈希值,你可以追踪到该版本在开发过程中...
8. **mongofiles**: 用于管理和操作MongoDB的GridFS文件系统,适合存储大型文件。 9. **bsondump**: 工具用于将BSON文件转换为JSON格式,便于分析或处理。 10. **mongoclient**: 一个通用的命令行工具,用于测试...
MongoDB 是一个高性能、开源、无模式的分布式文档数据库,被广泛应用于Web应用程序、大数据分析、内容管理系统等场景。MongoDB 3.0.7 版本是2015年发布的一个稳定版本,它提供了许多重要的改进和新特性。 在Linux ...
总之,"mongodb/mongo-go-driver"是一个强大且灵活的Go语言驱动程序,为MongoDB提供了丰富的功能集,使得Go开发者能轻松地构建和扩展基于MongoDB的应用。这个Alpha 2版本表明项目正在不断进化和完善,对于那些希望在...
在Java应用程序中,为了与MongoDB进行交互,我们需要使用Java MongoDB驱动程序。这个压缩包包含的就是Java连接MongoDB所需的驱动jar包,确保了开发者能够通过编程方式连接到MongoDB数据库并执行各种操作。 首先,让...
7. **GridFS**:MongoDB提供了GridFS接口,用于存储和检索大型文件,如图片或视频。 在3.2.12这个特定版本中,有以下一些重要改进: 1. **安全增强**:包括认证、授权和加密的强化,提高了系统的安全性。 2. **...
这份"MongoDB参考手册-新"提供了一套全面的学习资源,帮助读者深入理解和应用MongoDB。以下是一些关键知识点的概述: 1. **MongoDB基础**:MongoDB使用JSON格式的数据结构,称为BSON(Binary JSON),这使得数据...