MongoDB对图片进行CRUD操作——与JAVA结合

标签: mongodb 图片 crud | 发表时间:2015-05-29 22:07 | 作者:dandanzmc
出处:http://blog.csdn.net

        上几篇博客简单对MongoDB进行了简单介绍和如何安装,以及在dos下是如何操作MongoDB和在安装MongoDB中,出现了什么错误,是如何解决的。当然这些都还不够,我们还要用到实际当中去。我用MyEclipse+JDK1.7做了一个简单的demo,来展示下MongoDB怎么运用到实际中去。

       MongoDB作为一个NoSql数据库的代表,存取多媒体数据,应该是强项吧?那么,在MongoDB中是如何对图片进行CRUD操作的。

       上几篇博客中已经提到,MongoDB的文档结构是BSON格式,BSON格式本身支持保存二进制格式的数据,所以可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中。但是一个BSON的最大长度不能超过4M,所以限制了单个文档中能存入的最大文件不能超过4M。为了解决这个问题,MongoDB提供了“GridFS”方式,“GridFS”方式对文件操作需要引入相关jar包——mongo-java-driver-2.9.3.jar。

      不多说,看实例:

package com.zd.mongodb.common;

import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;

public class MongoDBCommon {

	// 连接mongodb
	public DB MongoDbConnection() {
		Mongo m = null;
		try {
			m = new Mongo("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		DB db = m.getDB("test");
		return db;
	}

	// 保存图片信息
	public void saveFile(String connection, String id, String file) {
		DB db = MongoDbConnection();  //获取MongoDB的数据库
		File imageFile = new File(file);
		GridFS gfsPhoto = new GridFS(db, connection); //connection为集合名词
		GridFSInputFile gfsFile = null;
		try {
			gfsFile = gfsPhoto.createFile(imageFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		gfsFile.setId(id);
		gfsFile.setContentType("image/jpeg");
		gfsFile.save();

	}

	// 读取文件
	public void readFile(String connection, String fileName) {
		DB db = MongoDbConnection();  //获取连接
		DBCollection collection = db.getCollection(connection);  //connection为集合名称
		String newFileName = fileName;
		GridFS gfsPhoto = new GridFS(db, connection);
		GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
		System.out.println(imageForOutput);   <span style="font-family: Arial, Helvetica, sans-serif;">//返回数据以BSON格式体现</span>
	}

	//根据id查询相应文件
	public void findByObjectId(String connection, String id) {
		DB db = MongoDbConnection();
		DBCollection collection = db.getCollection(connection);
		DBObject dbObj = collection.findOne(id);
		System.out.println(dbObj);  //返回数据以BSON格式体现

	}

	// 删除文件
	public void deleteFile(String connection,String id) {
		DB db = MongoDbConnection();
		DBCollection collection = db.getCollection(connection);
		DBObject o=collection.findOne(id);
		collection.remove(o);
	}

}


客户端:

package com.zd.mongodb.common;


public class ZhudanTest {
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span> public static void main(String[] args) throws Exception {
<span style="white-space:pre">		</span> MongoDBCommon dbCommon=new MongoDBCommon();
<span style="white-space:pre">		</span> String newFileName="zhudan.jpg";
<span style="white-space:pre">	</span>     String imageFile="D:/生活/照片/me/zhudan.jpg";
//<span style="white-space:pre">	</span>     String connection="photo.files";
<span style="white-space:pre">	</span>     String connection="photo";
<span style="white-space:pre">	</span>     
<span style="white-space:pre">	</span>     //根据id保存数据
<span style="white-space:pre">	</span>     String id="1111";
<span style="white-space:pre">	</span>     dbCommon.saveFile( connection, id, imageFile);
<span style="white-space:pre">	</span>     
<span style="white-space:pre">	</span>     //根据名称获取数据
//<span style="white-space:pre">		</span> dbCommon.readFile(connection, newFileName);
<span style="white-space:pre">	</span>     
<span style="white-space:pre">	</span>     //根据id删除数据
//<span style="white-space:pre">	</span>     String id="1111";
//<span style="white-space:pre">	</span>     dbCommon.deleteFile(connection,id);
<span style="white-space:pre">		</span> 
<span style="white-space:pre">	</span>     //根据id查询数据
//<span style="white-space:pre">		</span> String id="1111";
//<span style="white-space:pre">		</span> dbCommon.findByObjectId(connection, id);
<span style="white-space:pre">		</span> 
<span style="white-space:pre">	</span> }
}

以图为证:

再分析下原理:

       创建photo时,驱动首先会在当前数据库创建两个集合:一个是"photo.files"集合,另一个是"photo.chunks"集合,前者记录了文件名,文件创建时间,文件类型等基本信息;后者分块存储了文件的二进制数据(并支持加密这些二进制数据)。

       一个trunk有一个默认的大小,当文件超过这个默认大小后,会把文件分割成多个chunk,再把这些chunk保存到photo.chunks中,最后再把文件信息存入到photo.files中。

        在读取文件的时候,先根据查询条件,在photo.files中找到一个合适的记录,得到“_id”的值,再据这个值到photo.chunks中查找所有“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的内容,还原成原来的文件。

       说到原理,我在测试的过程中,在保存图片的时候,我需要用的集合名称是photo,在读取和删除图片的时候,我需要用的完整集合名称是photo.files。如果此时我用集合名未photo时,查找不到相关数据。

总结:

       MongoDB作为一个NoSql数据库的代表,其实它里面包含的东西还有很多,我所接触到的也只是冰山一角,为以后的MongoDB的学习做一个小小的准备。

        



      


       

        

作者:dandanzmc 发表于2015/5/29 22:07:00 原文链接
阅读:60 评论:0 查看评论

相关 [mongodb 图片 crud] 推荐:

MongoDB对图片进行CRUD操作——与JAVA结合

- - CSDN博客推荐文章
        上几篇博客简单对MongoDB进行了简单介绍和如何安装,以及在dos下是如何操作MongoDB和在安装MongoDB中,出现了什么错误,是如何解决的. 当然这些都还不够,我们还要用到实际当中去. 我用MyEclipse+JDK1.7做了一个简单的demo,来展示下MongoDB怎么运用到实际中去.

基于MongoDB GridFS的图片存储

- Eneri - Liút
商品图片,平均200-500K,说大不大,说小不小,但量大且细碎,最早通过页面上传,全部保存在文件里,且不分目录,管理和索引都很慢,几乎无法备份,读取也很慢. 改进方案由大鱼设计,图片是保存在MySQL表里,每10万张图就换一张新表,操作语言是PHP,它解决了图片备份和缓存的问题. 经过一段运行时间后,我对效果并不满意,主要是速度还是有些慢,尤其是第一次加载的过程.

[mongodb] java操作mongodb

- - 数据库 - ITeye博客
           //实例化Mongo对象,连接27017端口.                               //连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立. //从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立.

一个关于jquery easyui crud demo 的一个例子

- - Web前端 - ITeye博客
注:这个程序jsp的源代码在这个http://www.jeasyui.com/demo/main/index.php网址的basic crud里面下载它用的是html + php 我们今天要把他改成 Java后台 struts + hibernate + ibatis. 这里是jsp代码easyui.jsp.

【MongoDB】MongoDB之优化器Profiler

- - CSDN博客数据库推荐文章
在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能. Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优;. 一、开始profiler功能. 开启profier功能有两种:. 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别.

夜说mongodb

- Lianhui Wang - NoSQLFan
前两天本站刚刚分享了wordnik使用MongoDB经验的文章:《Wordnik 的 MongoDB 使用经历》,今天又看到一位朋友对这方面做的总结,分享在这里,供大家参考. 赋闲以后很长没有更新博客了,说忙完全是借口,多半因为没有兴致所致. 今天凌晨比赛多多,趁着比赛的前奏和间隙,遂浏览些技术文章.

MongoDB与内存

- 高春辉 - 火丁笔记
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了. 据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:. 这台MongoDB服务器有没有性能问题. 先讲讲Linux是如何管理内存的.

白话MongoDB(一)

- Ease - 江边潮未尽,枫红一季秋
按照官方的说法,MongoDB是一种可扩展的高性能的开源的面向文档(document-oriented )的数据库,采用C++开发. 注意mongo不是mango(芒果),这个词是从humongous中截取出来的,其野心不言而明,直指海量数据存储. 和其他很多NoSQL不太一样,MongoDB背后有一个专门的商业公司在提供支持和推广,有点类似MySQL AB的模式.

MongoDB 索引

- - 博客园_首页
索引是用来加快查询的,数据库索引与数据的索引类似,有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,. 使得查询速度很快,在索引中找到条目后,就可以直接跳转到目标文档的位置.. 要掌握如何为查询配置最佳索引会有些难度.. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB..