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

上几篇博客简单对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的学习做一个小小的准备。

时间: 2024-10-14 21:40:47

MongoDB对图片进行CRUD操作——与JAVA结合的相关文章

MongoDB的CRUD操作(java Util )

1.保存插入操作: public static synchronized String insert(DBObject record) { DBCollection col = MongoDB.getDBCollection(TABLE_NAME); record.put("time", new Date().getTime()); WriteResult result = col.insert(record); //当前插入表的_id return record.get("

Ruby操作MongoDB(进阶)-CRUD操作

MongDB数据库的使用离不开CRUD操作.什么是CRUD,就是创建文档,读取文档信息,更新文档和删除文档. key-value键值对标记 在MongoDB的Ruby驱动中,Key_value键值多次出现.而且有时会出现语法上的巧合,这取决于在使用的Ruby版本中如何申明. 在文档创建步骤中,1.9及之后版本支持以下语法: document={name:"Tom",age:20}. 但是如果你使用的是2.2或者更高的版本,你可以用双引号将你的key包起来.如: document={&q

MongoDB的CRUD操作

1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的增删改查操作,不同于我们熟悉的关系数据库中的操作.在关系数据库中,比如MySQL,我们通常使用SQL语句对数据库进行增(INSERT)删(DELETE)改(UPDATE)查(SELECT).MongoDB在对数据进行操作过程中,使用的是Document进行数据操作.在对数据库进行操作的时候,使用Do

【翻译】MongoDB指南/CRUD操作(三)

[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近性,分布式查询(Distributed Queries),分布式写操作,模拟两阶段任务提交,在副本集中执行配额读取 1 原子性和事务(Atomicity and Transactions) 在MongoDB中,写操作在单文档级别具有原子性,即使修改一个文档中的多个嵌入式文档也是如此. 当一个写操作修

【翻译】MongoDB指南/CRUD操作(二)

[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关注),写确认(写关注) 1 更新文档 1.1 更新 MongoDB提供下列方法用于更新一个集合 db.collection.updateOne() 更新使用指定过滤器匹配到的文档,即使过滤器匹配到多个文档,也只会更新一个文档. 3.2版本新增特性. db.collection.updateMany(

【翻译】MongoDB指南/CRUD操作(一)

[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删除文档. 创建操作 执行创建或者插入操作可向集合中添加文档.如果集合不存在,插入操作会创建此集合. MongoDB提供下列方法向集合中插入文档: db.collection.insert() db.collection.insertOne()  3.2版本新增 db.collection.inser

mongodb的CRUD操作三

聚合操作 count()统计行数 计算总计 sum aggregate是聚合的操作符,然后分组,然后再sum

mongodb的CRUD操作二查询

---恢复内容开始--- 查询才是我们用的最多最多的 find() 查询所有的行 指定一个关键字的查询 那么我想看这个列的所有行 前面的{}是代表了我没有加任何的条件 这里是代表是我要找uname是LY的行的deptnolie.前面的_id:0是代表我不想显示_id这个列 这里就是代表了我想要看这些列的所有行可以对比一下 过滤一些列的写法xxx:0就可以了 去重 distinct("列名") 这样我就可以把这列的值去重了 分页查询 加了条件的限制查询 跳开前几行: 从第3行开始到第6行

Mongodb的安装与CRUD操作

What is Mongodb ?         Mongo DB是一款开源的非关系型数据库(NoSql)其文档模型自由灵活,可以让你在开发过程中畅顺无比.对于大数据量.高并发.弱事务的互联网应用,MongoDB可以应对自如.MongoDB内置的水平扩展机制提供了从百万到十亿级别的数据量处理能力,完全可以满足Web2.0和移动互联网的数据存储需求,其开箱即用的特性也大大降低了中小型网站的运维成本. 安装Mongodb 来到mongodb官网http://www.mongodb.org/可以在这