- 浏览: 633280 次
- 性别:
- 来自: 北京
博客专栏
-
实战cglib
浏览量:50634
文章分类
最新评论
-
zhongyuanceshi:
非常厉害。看了下有了整体认识
NanoHttpd源码分析 -
di1984HIT:
xuexile!!
使用Jackson在Java中处理JSON -
小胖vs小猪:
能说明一下jar包的引用情况么。
实战CGLib系列之proxy篇(一):方法拦截MethodInterceptor -
魔主万界DEV:
楼主写的不错啊!赞一个!
一个FTP Pool工具类的实现(Commons Pool) -
yuanliangding:
java里的select不是要用户自己调了?然后拿出key一个 ...
IO系列文章之五:读《Scalable io in java》看Socket网络编程模型演变
在工作中使用到了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)
发表评论
-
关于Redis扩容方案
2013-08-08 07:33 2960首先关于Redis,目前某应用redis部署2台机器,做m ... -
Redis回顾与总结(持续更新中)
2013-02-01 22:20 3712前一段时间公司某项目使用了Redis作为缓存服务器,年前不 ... -
MongoDB Sharding深入学习
2012-09-04 21:59 6079对于MongoDB的Sharding(分片)技术并不陌生,但是 ... -
MongoDB程序开发之ORM工具Morphia
2012-07-12 23:17 15856上次的Blog中写到要写一篇关于mongodb的ORM工具的文 ... -
公司某产品MongoDB分布式架构总结
2012-05-01 19:21 4405本篇博客的内容是对目前公司某产品在mongodb架构方面的一些 ... -
MongoDB在Linux环境下安装
2012-04-26 00:04 11181.到MongoDB官网下载linux安装文件(步骤省略)。 ... -
MongoDB在windows环境下安装
2012-04-21 00:07 11201.到mongodb官网下载一个win32版本(步骤此处略过, ... -
MongoDB之旅
2012-04-20 22:11 8473MongoDB是目前工作中经常使用到的NoSQL数据库。 本 ...
相关推荐
MongoDB提供了多种语言的驱动程序,Java驱动是其中之一。它基于Java 6及更高版本,实现了MongoDB的Wire Protocol,允许Java应用与MongoDB进行通信。Java驱动分为几个主要版本,每个版本可能对应不同的功能特性和兼容...
MongoDB Java驱动是Java开发者与MongoDB数据库交互的主要工具,它是MongoDB官方提供的一款开源库,使得在Java应用程序中执行CRUD(创建、读取、更新、删除)操作变得简单。MongoDB Java驱动源码程序提供了深入理解其...
在Java开发环境中,MongoDB提供了Java驱动API,使得Java程序员可以方便地与MongoDB进行交互。本文档将深入探讨如何利用Java驱动API来操作MongoDB数据库。 一、MongoDB Java驱动API简介 MongoDB的Java驱动程序是Java...
在Java开发中,与MongoDB交互通常需要使用官方提供的Java驱动程序。本篇文章将详细介绍“mongodb java驱动支持jar”及其源码,帮助开发者更好地理解和使用这些资源。 首先,`mongo-java-driver-3.8.0.jar`是MongoDB...
MongoDB的Java驱动是连接Java应用程序与MongoDB数据库的关键组件,3.7.0版本是这一驱动的一个稳定发行版。这个压缩包包含了三个核心的JAR文件,它们分别是`mongodb-driver-3.7.0.jar`、`mongodb-driver-core-3.7.0....
为了更好地理解和使用MongoDB Java驱动程序,建议参考官方文档和社区资源,如CSDN上的博客(如链接所示),以及Stack Overflow等平台上的讨论。同时,不断学习和实践,以适应不断发展的MongoDB和Java技术栈。
MongoDB的Java驱动3.2版本是连接Java应用程序与MongoDB数据库的重要组件,它提供了丰富的API,使得开发人员能够方便地执行CRUD(创建、读取、更新、删除)操作以及更复杂的数据库交互。MongoDB是一款流行的开源文档...
在本文中,我们将深入探讨如何使用Java连接MongoDB,涉及的知识点包括MongoDB Java驱动程序的安装、配置,以及基本的连接和操作数据库的方法。 首先,我们来看“java连接mongodb的jar包”。这个“mongodbjar”通常...
2. 连接池实现:可能是第三方库,如HikariCP或Apache DBCP2,它们提供了连接池的实现,可以被MongoDB Java驱动程序使用。 3. 示例代码:展示如何配置和使用连接池,包括初始化、获取连接、归还连接等操作。 4. 配置...
本篇将深入探讨"mongodb_java_2.6_API",即MongoDB 2.6版本的Java驱动程序API,了解如何使用Java进行MongoDB的开发。 1. **MongoDB Java驱动程序概述** MongoDB的Java驱动程序是Java开发者与MongoDB服务器通信的...
Java开发MongoDB部分是面试中常见的技术领域之一,尤其对于工作一年左右的开发者来说,掌握MongoDB的使用和应用能够提升自己的竞争力和职业发展。下面将详细介绍一些可能涉及的面试题,帮助你更好地准备。首先,...
MongoDB Java驱动程序提供了Java API,使得开发人员能够通过编写Java代码来执行各种数据库操作,如创建、读取、更新和删除(CRUD)数据。这个驱动包直接适用于Java项目,简化了集成过程。 1. **连接MongoDB**: 驱动...
在Java开发中,与MongoDB交互通常使用MongoDB Java驱动程序,这是一个官方支持的Java SDK,允许开发者在Java应用中轻松地存取MongoDB数据。 MongoDB Java驱动程序提供了一套丰富的API,用于执行各种数据库操作,如...
在Java开发环境中,为了与MongoDB进行交互,我们通常会使用官方提供的Java驱动程序。本篇将深入探讨“MongoDB驱动Java版”,即mongodb-java-driver,版本为2.11.2。 MongoDB Java驱动程序是Java开发者与MongoDB...
然后,《Mongodb之java操作.doc》将详细介绍如何在Java应用程序中集成和使用MongoDB。Java驱动程序是连接MongoDB的主要方式,文档可能涵盖以下内容: 1. 添加MongoDB Java驱动程序依赖:通常通过Maven或Gradle添加`...
MongoDB官方提供了Java驱动程序,使得开发者能够方便地在Java应用中集成MongoDB功能。本篇文章将详细讲解如何使用Java连接MongoDB,以及涉及到的关键JAR包的作用。 首先,我们来看一下标题中提到的三个关键JAR文件...
目前,Java驱动通常使用的是MongoDB Java Driver,可以在Maven仓库中找到对应的依赖,例如: ```xml <groupId>org.mongodb <artifactId>mongodb-driver-sync <version>4.3.0 ``` 接下来,我们需要配置MongoDB...
Java驱动是MongoDB官方提供的用于Java应用程序与MongoDB服务器进行交互的接口。在这个"mongoDB-2.5.3 java驱动源码"中,我们可以深入理解MongoDB Java驱动的工作原理和实现细节。 MongoDB Java驱动源码分为几个主要...
为了方便开发者使用 Java 进行开发,MongoDB 提供了官方的 Java 驱动程序(MongoDB Java Driver),使得 Java 应用能够轻松地与 MongoDB 数据库进行交互。 #### 二、基本概念与连接 在开始使用 MongoDB Java Driver...