`

MongoDB程序开发之使用Java驱动

 
阅读更多

在工作中使用到了MongoDB,平时也看了一些资料,感觉MongoDB官网内develop zone有个不错的manual,很多资料都可以查到,地址如下:http://www.mongodb.org/display/DOCS/Manual

 

另外,本blog主要记录一下使用mongodb java driver来访问数据库的一些总结。

 

 主要是由createMongoInstance()方法完成初始化工作。

protected static final Mongo mongoInstance = createMongoInstance();

private static Mongo createMongoInstance() {
        MongoOptions mo = new MongoOptions();
        mo.socketKeepAlive=true;
        mo.autoConnectRetry = true;
        mo.maxAutoConnectRetryTime=10;
        mo.connectionsPerHost = 40;
        mo.connectTimeout = 20 * 1000;
        mo.socketTimeout = 60 * 1000;
        try {
            if (DatabaseProject.DB_CONFIG.containsKey("mongodb.ips")) {
                return new Mongo(getServerAddrsFromConf("mongodb"),mo);
            }
            return new Mongo(new ServerAddress(DatabaseProject.DB_CONFIG.getString("mongodb.ip"), DatabaseProject.DB_CONFIG.getInt("mongodb.port")),mo);

        } catch (Throwable e) {
            DatabaseProject.LOGGER.error("Failed to init mongodb", e);
            throw new ExceptionInInitializerError(e);
        }
    }

  其中有一些数据库配置直接写在配置文件里了,在MongoJavaDriverDAO中初始化一部分数据:

 

public void insertCollData(){
		//如果该collection不存在则会自动创建
		DBCollection parentcoll = getCollection("ParentColl");
		DBCollection childcoll = getCollection("ChildColl");
		for(int i=0;i<1000;i++){
			DBObject document = new BasicDBObject();
			document.put("intData", 1000+i);
			document.put("longData", System.currentTimeMillis());
			document.put("strData", UUID.randomUUID().toString());
			document.put("doubleData", 1.123+i);
			document.put("createDate", new Date());
			document.put("booleanData", true);
			DBObject innerDoc = new BasicDBObject();
			innerDoc.put("innertype", "string");
			innerDoc.put("innerContent", "string"+i);
			document.put("documentData", innerDoc);
			parentcoll.insert(document);
			DBObject childDocument = new BasicDBObject();
			childDocument.put("parentId", document.get("_id"));
			childDocument.put("createDate", new Date());
			List list = new ArrayList();
			list.add("str" + i%10);
			list.add("str" + i%20);
			list.add(new BasicDBObject("arr"+(i%10),(i%10)));
			list.add(new BasicDBObject("arr"+(i%20),(i%20)));
			childDocument.put("arrays",list);
			childcoll.insert(childDocument);
		}
		System.out.println("ParentColl Count:"+parentcoll.count());
		System.out.println("ChildColl Count:"+childcoll.count());
	}

 其中getCollection方法会获取集合,不存在的话会自动创建一个。getCollection方法如下:

 

public static DBCollection getCollection(String collectionName){
	return getDB().getCollection(collectionName);
}

 现在创建了2个集合ParentColl、ChildColl,并初始化了数据。

查询相关方法:

 

/**
	 * 查询全部数据
	 */
	public void findColl(){
		coll = getCollection("ParentColl");
		DBCursor cur = coll.find();
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
		System.out.println("Count:"+coll.count());
	}
	
	/**
	 * 根据ObjectId查询
	 */
	public void findById(String id){
		coll = getCollection("ParentColl");
		DBCursor cur = coll.find(new BasicDBObject("_id", new ObjectId(id)));//直接用string查不出来
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
	}
	
	/**
	 * And多条件查询
	 */
	public void findByAndQuery(int intData,long longData){
		coll = getCollection("ParentColl");
		BasicDBObject query = new BasicDBObject();
		query.put("intData", intData);
		query.put("longData", longData);
		System.out.println(coll.findOne(query));
	}
	
	/**
	 * OR多条件查询
	 */
	public void findByORQuery(int lte,int gt,long longData){
		coll = getCollection("ParentColl");
		BasicDBObject query=new BasicDBObject();
		BasicDBObject longdata = new BasicDBObject("longData", longData);
		BasicDBObject intdata = new BasicDBObject("intData", new BasicDBObject().append("$gt", gt).append("$lte",lte));
		BasicDBList cond=new BasicDBList();
		cond.add(longdata);
		cond.add(intdata);
		query.put("$or", cond);
		DBCursor cur = coll.find(query);
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
	}
	
	/**
	 * IN查询
	 */
	public void findByINQuery(int value1,int value2){
		coll = getCollection("ParentColl");
		BasicDBObject query=new BasicDBObject();
		BasicDBList cond=new BasicDBList();
		cond.add(value1);
		cond.add(value2);
		query.put("intData",new BasicDBObject("$in", cond));
		DBCursor cur = coll.find(query);
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
	}
	
	/**
	 * NOT查询
	 */
	public void findByNotQuery(int value1,int value2){
		coll = getCollection("ParentColl");
		BasicDBObject query=new BasicDBObject();
		BasicDBList cond=new BasicDBList();
		cond.add(value1);
		cond.add(value2);
		query.put("intData",new BasicDBObject("$nin", cond));
		System.out.println("Count:"+coll.find(query).count());
	}
	
	/**
	 * 获取结果集第一条
	 */
	public void fetchFirstQuery(int value1,int value2){
		coll = getCollection("ParentColl");
		BasicDBList cond = new BasicDBList();
		cond.add(value1);
		cond.add(value2);
		BasicDBObject query = new BasicDBObject().append("intData",new BasicDBObject("$nin",cond));
		System.out.println(coll.findOne(query));
	}
	
	/**
	 * 查询文档部分列
	 */
	public void querySomeKey(){
		coll = getCollection("ParentColl");
		DBCursor cur = coll.find(new BasicDBObject(),new BasicDBObject("intData",true));
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
	}
	
	/**
	 * 查询内嵌文档
	 */
	public void queryInnerDocument(){
		coll = getCollection("ParentColl");
		BasicDBObject map = new BasicDBObject();
		map.put("innertype","string");
		map.put("innerContent","string0");
		DBCursor cur = coll.find(new BasicDBObject("documentData",map));
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
	}
	
	/**
	 * 查询内嵌部分文档
	 */
	public void querySubInnerDocument(){
		coll = getCollection("ParentColl");		
		DBCursor cur = coll.find(new BasicDBObject("documentData.innerContent","string0"));
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
	}
	
	/**
	 * 查询分页文档
	 */
	public void queryByPage(int skipNum,int pageNum){
		coll = getCollection("ParentColl");
		DBCursor cur = coll.find().skip(skipNum).limit(pageNum);
		while(cur.hasNext()){
	        System.out.println(cur.next());
	    }
	}
	
	/**
	 * 查询文档某列是否存在
	 */
	public void queryExists(){
		coll = getCollection("ParentColl");
		DBCursor cur = coll.find(new BasicDBObject("longData",new BasicDBObject("$exists",true)));
		while(cur.hasNext()){
			System.out.println(cur.next());
		}
	}
	
	/**
	 * 查询文档排序
	 */
	public void sortDocument(){
		coll = getCollection("ParentColl");
		DBCursor cur = coll.find().sort(new BasicDBObject("intData",-1));//1:asc / -1:desc
		while(cur.hasNext()){
			System.out.println(cur.next());
		}
	}

补充distinct查询:

  /**
	 * 获取根据某元素做distinct查询.
	 */
	   public void distinctKey(){
		coll = getCollection("ParentColl");
		List<String> list = coll.distinct("documentData.innertype");
		for(String str:list){
			System.out.println(str);
		}
	   }

不难发现主要用到BasicDBObject、BasicDBList、DBCursor这三个类。BasicDBObject好比一个map,好比使用json查询中的{} 。BasicDBList是个list,用于or,nin等条件查询。DBCursor用于遍历结果集。其实只要将对应的json查询使用这3个类转化一下,就能写出对应的java代码了。

 

更新相关:

 

/**
	 * 更新文档1
	 */
	public void updateDocument(){
		DB db = getDB();
		//由于mongodb中使用连接池的原因,getLastError()需要再次从连接池中获取连接.
		//保证update操作和getLastError()使用同一个连接.
		db.requestStart();
		coll = db.getCollection("ParentColl");
		WriteResult result = coll.update(new BasicDBObject("intData",1100),new BasicDBObject("$set", new BasicDBObject("booleanData",false)));
		System.out.println("update count:"+result.getN());
		if(result.getLastError().ok()){//获取上次操作结果是否有错误.
			System.out.println("update document success.");
		}else{
			System.out.println(result.getLastError().getErrorMessage());
		}
		db.requestDone();
	}
	
	/**
	 * 更新文档2
	 */
	public void updateMultiDocument(){
		DB db = getDB();
		db.requestStart();
		coll = db.getCollection("ParentColl");
		//第三个参数:如果没有该文档是否创建,第四个参数:是否更新全部匹配条件的文档.
		WriteResult result = coll.update(new BasicDBObject("booleanData",false),new BasicDBObject("$set", new BasicDBObject("booleanData",true)),false,true);
		System.out.println("update count:"+result.getN());
		if(result.getLastError().ok()){//获取上次操作结果是否有错误.
			System.out.println("update document success.");
		}else{
			System.out.println(result.getLastError().getErrorMessage());
		}
		db.requestDone();
	}

 注意requestStart、requestDone方法保证使用同一个数据库连接。WriteResult记录更新结果。 

 

索引相关:

 

/**
	 * 创建唯一索引
	 */
	public void createIndexes(){
		coll = getCollection("ParentColl");
		BasicDBObject index = new BasicDBObject();
		index.put("intData",1);//1:asc / -1:desc
		index.put("unique",true);//唯一索引
		coll.createIndex(index);
	}
	
	/**
	 * 查询索引信息
	 */
	public void getIndexes(){
		coll = getCollection("ParentColl");
		List<DBObject> indexInfo = coll.getIndexInfo();
		System.out.println(indexInfo);
	}
	
	/**
	 * 删除索引信息
	 */
	public void dropIndexes(){
		coll = getCollection("ParentColl");
		//删除的索引必须跟创建的索引名称\排序\是否唯一都相同才能删除
		BasicDBObject index = new BasicDBObject();
		index.put("intData",1);
		index.put("unique",true);
		coll.dropIndex(index);
	}

 对于文档可能还会对数组操作:

 

/**
	 * 取出文档中的数组
	 */
	public void queryArray(){
		coll = getCollection("ChildColl");
		DBCursor cur = coll.find(new BasicDBObject(),new BasicDBObject("arrays",1));
		while(cur.hasNext()){
			BasicDBObject bo = (BasicDBObject)cur.next();
			List<BasicDBObject> list = (List<BasicDBObject>)bo.get("arrays");
			System.out.println(list.toString());
		}
	}
	
	/**
	 * 查询数组内是否包含某元素
	 */
	public void queryElementInArray(){
		coll = getCollection("ChildColl");
		BasicDBObject query = new BasicDBObject();
		BasicDBObject obj = new BasicDBObject();
		obj.put("arr0",0);
		query.put("arrays", new BasicDBObject("$elemMatch",obj));
		DBCursor cur = coll.find(query);
		while(cur.hasNext()){
			System.out.println(cur.next());
		}
	}
	
	/**
	 * 数组内包含元素的值
	 */
	public void queryElementArray(){
		coll = getCollection("ChildColl");
		BasicDBObject obj = new BasicDBObject();
		obj.put("arrays", "str0");
		obj.put("arrays.arr0",0);
		obj.put("arrays.arr10",10);
		DBCursor cur = coll.find(obj);
		while(cur.hasNext()){
			System.out.println(cur.next());
		}
	}
	
	/**
	 * push(pushAll) array element
	 */
	public void pushElementInArray(String _id){
		DB db = getDB();
		db.requestStart();
		coll = getCollection("ChildColl");
		//WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$push",new BasicDBObject("arrays",new BasicDBObject("arr99","99"))));
		List<BasicDBObject> list=new ArrayList<BasicDBObject>();
		list.add(new BasicDBObject("arr99",99));
		list.add(new BasicDBObject("arr100",100));
		WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pushAll",new BasicDBObject("arrays",list)));
		System.out.println("update count:"+result.getN());
		if(result.getLastError().ok()){
			System.out.println("update document success.");
		}else{
			System.out.println(result.getLastError().getErrorMessage());
		}
		db.requestDone();
	}
	
	/**
	 * pull(pullAll) array element
	 */
	public void pullElementInArray(String _id){
		DB db = getDB();
		db.requestStart();
		coll = getCollection("ChildColl");
		List<BasicDBObject> list=new ArrayList<BasicDBObject>();
		list.add(new BasicDBObject("arr99",99));
		list.add(new BasicDBObject("arr100",100));
		//WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pull",new BasicDBObject("arrays",new BasicDBObject("arr100",100))));
		WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pullAll",new BasicDBObject("arrays",list)));
		System.out.println("update count:"+result.getN());
		db.requestDone();
	}
	
	/**
	 * pop array element(1,last;-1,first)
	 */
	public void popElementInArray(String _id){
		coll = getCollection("ChildColl");
		WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$pop",new BasicDBObject("arrays",-1)));//1,last;-1,first
		System.out.println("update count:"+result.getN());
	}
	
	/**
	 * addToSet And Each array element
	 */
	public void addToSetAndEachElementInArray(String _id){
		coll = getCollection("ChildColl");
		List list = new ArrayList();
		list.add("str0");
		list.add("str1");
		list.add(new BasicDBObject("arr99",99));
		WriteResult result = coll.update(new BasicDBObject("_id", new ObjectId(_id)),new BasicDBObject("$addToSet",new BasicDBObject("arrays",new BasicDBObject("$each",list))));//1,last;-1,first
		System.out.println("update count:"+result.getN());
	}

/**
	 * 按数组位置更新文档(查询条件需要包含更新内容,$为数组位置占位符,只更新匹配到的第一个文档.)
	 */
	public void updatePositionInArray(String _id){
		coll = getCollection("ChildColl");
		WriteResult result = coll.update(new BasicDBObject("arrays.arr0", 100),new BasicDBObject("$set",new BasicDBObject("arrays.$.arr0",101)));
		System.out.println("update count:"+result.getN());
	}

   以上都是一些基本的查询、更新操作,当然还有一些如map reduce和关联查询等复杂的方法,我将另写一篇blog总结一下。

 

参考文献包括:《mongodb权威指南》、《mongodb管理与开发精要》,另外文章开头提到的MongoDB官网内的develop zone也是很不错的资料来源。

PS:

mongodb driver在线API文档: http://api.mongodb.org/java/2.8.0/ (目前是2.8.0)

 

分享到:
评论

相关推荐

    MongoDB java使用文档

    MongoDB实现增删改查,java程序驱动,复杂查询,源代码示例

    mongoDB java 驱动

    在开发中使用 java ,数据库使用mongodb则mongodb-java-driver 是不可少的,本人亲自试过可以使用!

    MongoDB-Java驱动API

    此文档专门针对于使用Java语言操作MongoDB数据库的开发人员。

    Java开发面试-MongoDB专区

    Java开发MongoDB部分是面试中常见的技术领域之一,尤其对于工作一年左右的开发者来说,掌握MongoDB的使用和应用能够提升自己的竞争力和职业发展。下面将详细介绍一些可能涉及的面试题,帮助你更好地准备。首先,...

    mongo-java-driver-reactivestreams:MongoDB 的 Java Reactive Stream 驱动程序

    请不要直接通过电子邮件向任何 Java 驱动程序开发人员发送问题或疑问 - 您更有可能在 [mongodb-user] ( ) 列表中得到答案在 Google 网上论坛上。 至少,请在您的描述中包含您正在使用的驱动程序的确切版本。 如果您...

    MongoDB Java Driver 的使用:一个简单的例子,说明如何为 mongoDB 使用 Java 驱动程序。-matlab开发

    这是一个简单的例子,说明如何为 mongoDB 使用 java 驱动程序。 从http://www.mongodb.org/ : MongoDB 是一个开源文档数据库,也是领先的 NoSQL 数据库。 用 C++ 编写。 如果您没有任何工具箱来操作数据库,您有...

    mongo-java-driver:MongoDB的Java驱动程序

    请不要直接向任何Java驱动程序开发人员发送有关问题的电子邮件,否则您很可能在上得到答案。 至少,请在描述中包括您所使用的驱动程序的确切版本。 如果遇到连接问题,则粘贴构造MongoClient实例的代码行以及传递...

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    15.1.1 安装Java驱动程序和开发环境 15.1.2 访问控制 15.1.3 Java对MongoDB数据库的基本操作 15.1.4 Java驱动的一致性 15.2 Java常用操作 15.2.1 Java对MongoDB的操作实例 15.2.2 对用户的操作 ...

    mongo-monkey:MongoDB Java驱动程序的包装

    Mongo-monkey是mongodb的Java驱动程序的包装。 这个想法是使mongo java驱动程序可立即用于任何了解mongo cli的人。 理想情况下,它应该包含接近零的学习曲线,并且同时不影响提供给开发人员的灵活性。 免责声明 该...

    mongodb c++ 驱动

    MongoDB支持Perl、PHP、Java、C#、JavaScript、Ruby、C 和C++语言的驱动程序,MongoDB 提供了当前所有主流开发语言的数据库驱动包,开发人员使用任何一种主流开发语言都可以轻松编程,实现访问MongoDB 数据库。

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    15.1.1 安装Java驱动程序和开发环境 15.1.2 访问控制 15.1.3 Java对MongoDB数据库的基本操作 15.1.4 Java驱动的一致性 15.2 Java常用操作 15.2.1 Java对MongoDB的操作实例 15.2.2 对用户的操作 ...

    MongoDB权威指南(中文版)高清

    14511.1.2 使用Java驱动程序 14511.1.3 模式设计 14611.1.4 用Java实现 14811.1.5 一些问题 14911.2 新闻聚合器:PHP 14911.2.1 安装PHP驱动程序 15011.2.2 使用PHP驱动程序 15111.2.3 设计新闻聚集...

    node-mongodb-native:官方的MongoDB Node.js驱动程序

    MongoDB NodeJS驱动程序 Node.js的官方驱动程序。 注意:v3.x随API的重大更改而发布。 您可以找到更改列表。版本4.0 寻找最新的? 我们正在开发该驱动程序的下一个主要版本,该版本现已测试。 查看我们的 ,其中包括...

    mongo-c-driver:用于C的高性能MongoDB驱动程序

    mongo-c驱动程序 关于 mongo-c-driver是一个包含两个库的项目: libmongoc,一个用C编写的MongoDB客户端库。 libbson,一个提供有用的... JIRA中所有驱动程序项目(即CDRIVER,CSHARP,JAVA)和核心服务器(即SERVE

    EIMongoConnector:适用于MongoDB的WSO2企业集成器连接器

    版本MongoDB连接器1.0.0 蒙戈数据库3.4.15 Java Mongo驱动程序3.8.0 WSO2 EI 6.1.1Java MongoDB驱动程序复制并粘贴到&lt;EI&gt; / lib文件夹中。 之后重新启动EI。建造mvn全新安装使用MongoDB连接器构建此连接器后,将其...

    mongo-driver-3:一个用于Clojure的Mongo客户端,轻轻包装了Java驱动程序的3.114.0+版本

    它的开发具有以下目标: 简单的最新的最新驱动程序版本不会阻止访问底层驱动程序的最小层所有功能一致的API 通过宏进行配置地位mongo-driver-3已在生产中使用,但仍在开发中,API可能会略有变化。 请尝试一下,并...

    react:nodejs +React+ mongodb

    同构Java脚本的好处: 更好的整体用户体验搜索引擎可索引简化代码维护免费的渐进增强我已经构建了一个同构JS的实时示例,供您在这里查看: : 该演示使用组件展示了如何使具有大数据集的应用程序被搜索引擎索引,从而...

    Couchbase:Couchbase的eXist-db扩展

    该驱动程序不是开发的,因此不是官方驱动程序,也不是支持的驱动程序。 文献资料 该驱动程序的文档可在上找到。 提供了有关如何使用该软件的其他提示。 发布 该扩展程序可以从“页面下载,也可以使用的进行安装。 ...

    mongo-kafka:MongoDB Kafka连接器

    至少,请在说明中包括您所使用的驱动程序的确切版本。 如果您遇到连接问题,则粘贴Kafka连接器配置通常也很有用。 您还应该检查应用程序日志中是否有任何与连接相关的异常,并发布这些异常。 错误/功能请求 认为您...

    MongoDB-M101J

    MongoDB-M101J Spark运行在 MongoDB运行在 使用以下方法连接到mongo...第六周:应用工程驱动程序,复制和分片对设计和开发的影响。第七周:案例研究采访Foursquare的Jon Hoffman和codecademy采访Ryan Bubunksi期末考试

Global site tag (gtag.js) - Google Analytics