mongodb与文件

原创 2013年12月03日 16:06:45
MongoDB GridFS是mongodb的一个子模块,使用GridFS可以基于mongodb来持久存储文件.并且支持分布式应用(文件分布存储和读取).GridFS是mongodb中用户存储大对象的工具,对于mongodb,BSON格式的数据(文档)存储有尺寸限制,最大为16M.但是在实际系统开发中,经常会有上传图片或者文件的功能,这些文件可能尺寸会很大..我们可以借用Gridfs来辅助实现这些文件的管理.
Mongo GFS的文件表是由 表名.files和 表名.chunks 构成,前者是文件信息构成,后者是文件的内容,两者通过_id与files_id建立关联。
GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为mongodb的一个文档(document)被存储在chunks集合中..gridfs模块会为每个文件创建chunks和files信息.每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中.files集合中的文档就是BSON格式,可以使用mongodb的索引等等特性,当然可以对files文档做数据分析。
使用场景:如果你的系统有如下情景
1) 有大量的上传图片(用户上传或者系统本身的文件发布等)
2) 文件的量级处于飞速增长,有可能打到单机操作系统自己的文件系统的查询性能瓶颈,甚至超过单机硬盘的扩容范围.
3) 文件的备份(不适用gridfs这种三方也可以做,但是不尽方便),文件系统访问的故障转移和修复..
4) 文件的索引,存储除文件本身以外还需要关联更多的元数据信息(比如,不仅仅存储文件,还要保存一些文件的发布式作者/发布时间/文件tag属性等等自定义信息)并且需要索引的...
5) 基于4),对文件的分类模糊,如果采用操作系统的文件系统,文件夹分类关系混乱或者无法分类时..
6) 当前系统是基于web的,对图片的访问根据url了规则路由的..(普通文件系统也可以)

7) 文件尺寸较小,而且众多,且文件有可能被迁移/删除等

mongodb读写文件:

 mongodb操作文件,主要是通过GridFS类。存储文件主要存放在fs中了,其中的fs是数据库默认的。
  
   
   并且GridFS是直接与数据库打交道,与collection集合无关。
   具体的操作如下:其中有相应的注释:
  
  1.    package com.mongo.dao;  
  2.   
  3. import java.io.File;  
  4. import java.util.List;  
  5.   
  6. import com.mongodb.BasicDBObject;  
  7. import com.mongodb.DB;  
  8. import com.mongodb.DBObject;  
  9. import com.mongodb.Mongo;  
  10. import com.mongodb.gridfs.GridFS;  
  11. import com.mongodb.gridfs.GridFSDBFile;  
  12. import com.mongodb.gridfs.GridFSInputFile;  
  13.   
  14. /**  
  15. * 使用mongodb对文件的读取操作  
  16. * @author lhy  
  17. *  
  18. */  
  19. public class GridFSTest {  
  20.       
  21.      public static void main(String[] args) throws Exception {  
  22.           //saveFile();  
  23.           readFile();  
  24.      }  
  25.       
  26.      /**  
  27.      * 存储文件  
  28.      */  
  29.      public static void saveFile() throws Exception{  
  30.            
  31.           //连接服务器  
  32.           Mongo mongo=new Mongo();  
  33.           //连接数据库  
  34.           DB db=mongo.getDB("testGridFS");  
  35.            
  36.           //文件操作是在DB的基础上实现的,与表和文档没有关系  
  37.           GridFS gridFS=null;  
  38.           gridFS=new GridFS(db);  
  39.            
  40.           String fileName="vltest.log";  
  41.           File readFile=new File("d:/"+fileName);  
  42.            
  43.           GridFSInputFile  mongofile=gridFS.createFile(readFile);  
  44.         //可以再添加属性  
  45.           mongofile.put("path","d:/"+fileName);  
  46.           //保存  
  47.           mongofile.save();           
  48.      }  
  49.       
  50.      /**  
  51.      * 读文件,读到磁盘上  
  52.      * @throws Exception  
  53.      */  
  54.      public static void readFile() throws Exception{  
  55.           //链接服务器  
  56.           Mongo mongo=new Mongo();  
  57.           //连接数据库  
  58.           DB db=mongo.getDB("testGridFS");  
  59.           GridFS gridFs=null;  
  60.           gridFs=new GridFS(db);  
  61.            
  62.           //查找条件  
  63.           DBObject query=new BasicDBObject();  
  64.         //查询的结果:  
  65.           List<GridFSDBFile> listfiles=gridFs.find(query);  
  66.         GridFSDBFile gridDBFile=listfiles.get(0);  
  67.          
  68.         //获得其中的文件名  
  69.         //注意 : 不是fs中的表的列名,而是根据调试gridDBFile中的属性而来  
  70.         String fileName=(String)gridDBFile.get("filename");  
  71.          
  72.         System.out.println("从Mongodb获得文件名为:"+fileName);  
  73.           
  74.         File writeFile=new File("d:/"+fileName);  
  75.         if(!writeFile.exists()){  
  76.              writeFile.createNewFile();  
  77.           }  
  78.          
  79.         //把数据写入磁盘中  
  80.         //查看相应的提示  
  81.         gridDBFile.writeTo("d:/a.txt");  
  82.         //写入文件中  
  83.         gridDBFile.writeTo(writeFile);         
  84.          
  85.         }  
  86. }  


spring mongodb 读写文件:

先注入MongoDbFactory

[java] view plaincopy
  1. @Autowired  
  2.   private MongoDbFactory mongoDbFactory;  

获得DB对象

[java] view plaincopy
  1. DB db = mongoDbFactory.getDb();  

保存文件(其中FS_NAME相当于gridfs文件系统的表名,可以有多个)

[java] view plaincopy
  1. public boolean saveFile(File file, String fileName, String contentType,  
  2.       DBObject metaData) {  
  3.        
  4.     GridFSInputFile gfsInput;  
  5.     try {     
  6.       gfsInput = new GridFS(db, FS_NAME).createFile(file);  
  7.       gfsInput.setFilename(fileName);  
  8.       gfsInput.setContentType(contentType);  
  9.       gfsInput.setMetaData(metaData);  
  10.       gfsInput.save();  
  11.     } catch (IOException e) {  
  12.       log.error(e, e);  
  13.       return false;  
  14.     }  
  15.     return true;  
  16.   }  


通过文件名读取文件

[java] view plaincopy
  1. public GridFSDBFile findFileByName(String fileName){  
  2.     GridFSDBFile gfsFile ;  
  3.     try {        
  4.       gfsFile = new GridFS(db, FS_NAME).findOne(fileName);  
  5.     } catch (Exception e) {  
  6.       log.error(e, e);  
  7.       return null;  
  8.     }  
  9.     return gfsFile;  
  10.   }  


通过id读取文件

[java] view plaincopy
  1. public GridFSDBFile findFileById(String id){  
  2.     GridFSDBFile gfsFile ;  
  3.     try {        
  4.       gfsFile = new GridFS(db, FS_NAME).find(new ObjectId(id));  
  5.     } catch (Exception e) {  
  6.       log.error(e, e);  
  7.       return null;  
  8.     }  
  9.     return gfsFile;  
  10.   }  

输出文件到OutputStream

[java] view plaincopy
  1. private boolean writeToOutputStream(OutputStream out, GridFSDBFile gfsFile) {  
  2.     try {       
  3.       gfsFile.writeTo(out);  
  4.     } catch (IOException e) {  
  5.       log.error(e, e);  
  6.       return false;  
  7.     }  
  8.     return true;  
  9.   }  

版权声明:本文为博主原创文章,未经博主允许不得转载。

如何从MongoDB中读取文件

引言    在前两篇博客中给大家介绍了一些基本的概念和安装过程,这些相对来说都是比较简单的,记得在之前的项目 中用到这个技术,但是当时自己对这个东西非常陌生,并且没有太多的时间来研究这个东西,...
  • u013045437
  • u013045437
  • 2016年01月16日 23:21
  • 2274

Mongodb 内嵌数组操作

mongodb update 数组 操作 张映 发表于 2014-07-29 分类目录: nosql 标签:$, $addtoset, $each, $pop, $pull, $pullal...
  • u010807583
  • u010807583
  • 2015年11月19日 13:17
  • 4651

mongoDB内嵌文档查询

查询集合中数组的其中一个元素:      最近在工作中遇到了这样的一个问题: 如何取出集合中的一个数组中的一个元素?由于本人是刚刚接触到mongoDB,经过一番查找最终还是解决了       在需要对...
  • qq_37107280
  • qq_37107280
  • 2017年06月07日 14:43
  • 396

MongoDB运行日志自动分割

所谓自动分割MongoDB日志文件,就是指Rotate MongoDB log files,即让MongoDB每天(或每个星期,可自定义控制)生成一个日志文件,而不是将MongoDB所有的运行日志都放...
  • wangkai_123456
  • wangkai_123456
  • 2016年12月17日 12:27
  • 3412

将.xlsx和.sql文件导入mongodb

上一篇文章是将mongodb的数据导入mysql,这篇文章是它的逆过程。 一、将.xlsx文件导入mongodb中 同样,这里用到了mongoimport工具,由于它只能到如json和csv格式,先要...
  • iamxuhuimin
  • iamxuhuimin
  • 2016年12月05日 15:42
  • 1059

mongo对内嵌数组的操作

由于mongo的弱关联关系,导致mongo的内嵌数组会被频繁使用,以达到一定的"关联关系"。所以对mongo的数组的操作也是非常重要的。接下来简单的介绍一下mongo对数组的操作,至于用java进行这...
  • qq_20127333
  • qq_20127333
  • 2016年05月26日 17:05
  • 5761

通过Python将MongoDB导出的json数据转换成Mysql的insert语句导入

MongoDB数据导出 首先,MongoDB的数据导出仅支持Json及csv格式,无法直接导入可执行的Mysql数据库脚本。       所以,要完全将MongoDB的数据导入到Mysql可以通过先导...
  • roodyszz2013
  • roodyszz2013
  • 2015年10月31日 09:45
  • 1815

mongoDB的基本操作以及数据的导入导出,备份和恢复

mongoDB的基本操作以及数据的导入导出,备份和恢复 作者:he90227 基本概念与常用命令 为什么我们要使用MongoDB? 特点: 高性能...
  • yujin2010good
  • yujin2010good
  • 2016年11月19日 18:46
  • 2064

MongoDB 针对嵌套对象,多层级结构存储,增删改查

简要介绍NOSQLmongoDB 是属于NOSQL.什么是nosql,NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。 NoSQL,指的是非关系型的数据库。NoSQ...
  • walle167
  • walle167
  • 2016年04月29日 13:43
  • 10833

PHP操作MongoDB GridFS 存储文件,如图片文件

GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,...
  • black_OX
  • black_OX
  • 2014年01月21日 18:50
  • 4278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mongodb与文件
举报原因:
原因补充:

(最多只允许输入30个字)