`
tangzhibin
  • 浏览: 20680 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mongodb系列之-mongodb gridfs分析(java应用)

阅读更多

 

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-async-driver-2.0.1 jar包

    MongoDB异步驱动程序(mongodb-async-driver)是为Java开发者设计的一个库,它允许应用程序以非阻塞的方式与MongoDB服务器进行通信,提高了处理大量并发请求的能力。 在"mongodb-async-driver-2.0.1.jar"这个特定...

    mongodb-driver-3.6.3.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 ...

    mongodb-database-tools-windows-x86_64-100.3.1.zip

    4. mongoexport.exe:与mongoimport相反,它能将MongoDB数据导出为JSON、CSV或TSV格式的文件,便于数据分析或者在不同系统间转移数据。 5. mongofiles.exe:这是一个用于管理和操作MongoDB GridFS文件系统的命令行...

    Mongodb + GridFS +Java 操作Mongodb中存储的文件

    在这个Java操作MongoDB中存储的文件实例中,我们将探讨如何利用GridFS API进行文件的存取。 首先,我们需要在Java项目中引入MongoDB的驱动库。目前,Java驱动通常使用的是MongoDB Java Driver,可以在Maven仓库中...

    mongodb 所需jar包及gridfs java示例代码

    Java是开发MongoDB应用的常见语言之一,因为Java有丰富的驱动程序支持,其中就包括了MongoDB的Java驱动。在本主题中,我们将深入探讨MongoDB的Java开发所需jar包以及如何使用GridFS进行文件存储。 首先,MongoDB的...

    mongodb-linux-i686-3.2.20(Linux 32位)

    - **GridFS**:MongoDB的GridFS功能用于存储和检索大型文件,如图像或视频。 - **地理空间索引**:支持地理位置数据的索引和查询,适用于地理定位应用。 总之,"mongodb-linux-i686-3.2.20"是一个针对32位Linux...

    mongodb-linux-x86_64-rhel70-4.2.1.tgz

    5. **mongofiles**:用于管理和操作MongoDB的GridFS文件存储系统的工具。 要运行这个MongoDB实例,你需要完成以下步骤: 1. 解压文件到一个适当的目录,例如`/opt/mongodb`。 2. 创建一个数据目录,如`/data/db`,...

    mongodb-windows-x86_64-5.0.6-signed.zip

    MongoDB是一款分布式文档型数据库,被广泛应用于现代应用程序开发中,尤其在大数据、实时分析、内容管理和物联网(IoT)等场景下表现出色。标题"mongodb-windows-x86_64-5.0.6-signed.zip"表明我们讨论的是MongoDB的...

    mongodb-linux-i686-2.0.4

    5. GridFS:MongoDB内置了GridFS,这是一个用于存储和检索大型文件的规范,它将大文件分割成多个小块并存储在数据库中,方便高效访问。 6. 自动备份与恢复:MongoDB提供了工具进行数据备份和恢复,这对于灾难恢复和...

    mongodb-linux-x86_64-rhel70-5.0.1.tgz

    MongoDB 是一个高性能、开源、无模式的分布式文档数据库,被广泛用于开发现代应用程序,特别是那些需要处理大量数据和实时查询的应用。MongoDB 5.0.1 版本是针对Linux x86_64架构,特别是RHEL 7.0 (Red Hat ...

    Laravel开发-laravel-gridfs-storage

    `laravel-gridfs-storage`扩展使得开发者能够在Laravel应用中充分利用MongoDB的GridFS特性。 首先,让我们了解Laravel的存储服务。Laravel提供了一个强大的抽象层,允许开发者在多种存储驱动之间切换,如本地、S3、...

    MongoDBjava各版本驱动下载

    MongoDB Java驱动是Java开发者与MongoDB数据库交互的重要工具,它允许Java应用程序通过标准的Java API来执行查询、插入、更新和删除等操作。在Java中使用MongoDB,首先需要安装并配置对应的驱动版本,以确保与正在...

    mongodb-linux-x86_64-rhel70-3.0.15.tgz

    MongoDB是一种流行的开源、分布式文档数据库,常用于处理大规模数据。在Linux环境下,特别是RHEL (Red Hat...在管理MongoDB时,确保定期更新,应用安全最佳实践,包括设置用户权限、监控性能和日志,以及定期备份数据。

    mongodb-mongo-java-driver-r2.8.0-RC

    首先,我们来看看`mongodb-mongo-java-driver-45aa1c0`这个文件名。这个版本号`45aa1c0`通常代表的是Git仓库中的一个特定提交哈希值,它标识了源码的某个具体版本。通过这个哈希值,你可以追踪到该版本在开发过程中...

    mongodb-database-tools-rhel70-x86-64-100.5.4.tgz 连接工具

    8. **mongofiles**: 用于管理和操作MongoDB的GridFS文件系统,适合存储大型文件。 9. **bsondump**: 工具用于将BSON文件转换为JSON格式,便于分析或处理。 10. **mongoclient**: 一个通用的命令行工具,用于测试...

    mongodb-linux-x86_64-3.0.7.tgz

    MongoDB 是一个高性能、开源、无模式的分布式文档数据库,被广泛应用于Web应用程序、大数据分析、内容管理系统等场景。MongoDB 3.0.7 版本是2015年发布的一个稳定版本,它提供了许多重要的改进和新特性。 在Linux ...

    开源项目-mongodb-mongo-go-driver.zip

    总之,"mongodb/mongo-go-driver"是一个强大且灵活的Go语言驱动程序,为MongoDB提供了丰富的功能集,使得Go开发者能轻松地构建和扩展基于MongoDB的应用。这个Alpha 2版本表明项目正在不断进化和完善,对于那些希望在...

    mongodb数据库jar包

    在Java应用程序中,为了与MongoDB进行交互,我们需要使用Java MongoDB驱动程序。这个压缩包包含的就是Java连接MongoDB所需的驱动jar包,确保了开发者能够通过编程方式连接到MongoDB数据库并执行各种操作。 首先,让...

    mongodb-linux-x86_64-3.2.12.tgz

    7. **GridFS**:MongoDB提供了GridFS接口,用于存储和检索大型文件,如图片或视频。 在3.2.12这个特定版本中,有以下一些重要改进: 1. **安全增强**:包括认证、授权和加密的强化,提高了系统的安全性。 2. **...

    MongoDB参考手册-新

    这份"MongoDB参考手册-新"提供了一套全面的学习资源,帮助读者深入理解和应用MongoDB。以下是一些关键知识点的概述: 1. **MongoDB基础**:MongoDB使用JSON格式的数据结构,称为BSON(Binary JSON),这使得数据...

Global site tag (gtag.js) - Google Analytics