设为首页 收藏本站
查看: 1293|回复: 0

[经验分享] Mongodb程序开发之使用JAVA驱动

[复制链接]

尚未签到

发表于 2018-10-27 08:21:54 | 显示全部楼层 |阅读模式
  转载  http://shensy.iteye.com/blog/1545335、
  在工作中使用到了MongoDB,平时也看了一些资料,感觉MongoDB官网内develop zone有个不错的manual,很多资料都可以查到,地址如下:http://www.mongodb.org/display/DOCS/Manual
  另外,本blog主要记录一下使用mongodb java driver来访问数据库的一些总结。
  主要是由createMongoInstance()方法完成初始化工作。
Java代码  

  •   protectedstaticfinal Mongo mongoInstance = createMongoInstance();
  •   privatestatic 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")) {
  •   returnnew Mongo(getServerAddrsFromConf("mongodb"),mo);
  •   }
  •   returnnew 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);
  •   thrownew ExceptionInInitializerError(e);
  •   }
  •   }
  其中有一些数据库配置直接写在配置文件里了,在MongoJavaDriverDAO中初始化一部分数据:
Java代码  

  •   publicvoid insertCollData(){
  •   //如果该collection不存在则会自动创建
  •   DBCollection parentcoll = getCollection("ParentColl");
  •   DBCollection childcoll = getCollection("ChildColl");
  •   for(int i=0;i
  •   coll = getCollection("ParentColl");
  •   DBCursor cur = coll.find(new BasicDBObject("_id", new ObjectId(id)));//直接用string查不出来
  •   while(cur.hasNext()){
  •   System.out.println(cur.next());
  •   }
  •   }
  •   /**
  •   * And多条件查询
  •   */
  •   publicvoid 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多条件查询
  •   */
  •   publicvoid 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查询
  •   */
  •   publicvoid 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查询
  •   */
  •   publicvoid 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());
  •   }
  •   /**
  •   * 获取结果集第一条
  •   */
  •   publicvoid 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));
  •   }
  •   /**
  •   * 查询文档部分列
  •   */
  •   publicvoid querySomeKey(){
  •   coll = getCollection("ParentColl");
  •   DBCursor cur = coll.find(new BasicDBObject(),new BasicDBObject("intData",true));
  •   while(cur.hasNext()){
  •   System.out.println(cur.next());
  •   }
  •   }
  •   /**
  •   * 查询内嵌文档
  •   */
  •   publicvoid 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());
  •   }
  •   }
  •   /**
  •   * 查询内嵌部分文档
  •   */
  •   publicvoid querySubInnerDocument(){
  •   coll = getCollection("ParentColl");
  •   DBCursor cur = coll.find(new BasicDBObject("documentData.innerContent","string0"));
  •   while(cur.hasNext()){
  •   System.out.println(cur.next());
  •   }
  •   }
  •   /**
  •   * 查询分页文档
  •   */
  •   publicvoid queryByPage(int skipNum,int pageNum){
  •   coll = getCollection("ParentColl");
  •   DBCursor cur = coll.find().skip(skipNum).limit(pageNum);
  •   while(cur.hasNext()){
  •   System.out.println(cur.next());
  •   }
  •   }
  •   /**
  •   * 查询文档某列是否存在
  •   */
  •   publicvoid queryExists(){
  •   coll = getCollection("ParentColl");
  •   DBCursor cur = coll.find(new BasicDBObject("longData",new BasicDBObject("$exists",true)));
  •   while(cur.hasNext()){
  •   System.out.println(cur.next());
  •   }
  •   }
  •   /**
  •   * 查询文档排序
  •   */
  •   publicvoid 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查询:
Java代码  

  •   /**
  •   * 获取根据某元素做distinct查询.
  •   */
  •   publicvoid distinctKey(){
  •   coll = getCollection("ParentColl");
  •   List 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代码了。
  更新相关:
Java代码  

  •   /**
  •   * 更新文档1
  •   */
  •   publicvoid 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
  •   */
  •   publicvoid 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记录更新结果。
  索引相关:
Java代码  

  •   /**
  •   * 创建唯一索引
  •   */
  •   publicvoid createIndexes(){
  •   coll = getCollection("ParentColl");
  •   BasicDBObject index = new BasicDBObject();
  •   index.put("intData",1);//1:asc / -1:desc
  •   index.put("unique",true);//唯一索引
  •   coll.createIndex(index);
  •   }
  •   /**
  •   * 查询索引信息
  •   */
  •   publicvoid getIndexes(){
  •   coll = getCollection("ParentColl");
  •   List indexInfo = coll.getIndexInfo();
  •   System.out.println(indexInfo);
  •   }
  •   /**
  •   * 删除索引信息
  •   */
  •   publicvoid dropIndexes(){
  •   coll = getCollection("ParentColl");
  •   //删除的索引必须跟创建的索引名称\排序\是否唯一都相同才能删除
  •   BasicDBObject index = new BasicDBObject();
  •   index.put("intData",1);
  •   index.put("unique",true);
  •   coll.dropIndex(index);
  •   }
  对于文档可能还会对数组操作:
Java代码  

  •   /**
  •   * 取出文档中的数组
  •   */
  •   publicvoid queryArray(){
  •   coll = getCollection("ChildColl");
  •   DBCursor cur = coll.find(new BasicDBObject(),new BasicDBObject("arrays",1));
  •   while(cur.hasNext()){
  •   BasicDBObject bo = (BasicDBObject)cur.next();
  •   List list = (List)bo.get("arrays");
  •   System.out.println(list.toString());
  •   }
  •   }
  •   /**
  •   * 查询数组内是否包含某元素
  •   */
  •   publicvoid 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());
  •   }
  •   }
  •   /**
  •   * 数组内包含元素的值
  •   */
  •   publicvoid 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
  •   */
  •   publicvoid 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 list=new ArrayList();
  •   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
  •   */
  •   publicvoid pullElementInArray(String _id){
  •   DB db = getDB();
  •   db.requestStart();
  •   coll = getCollection("ChildColl");
  •   List list=new ArrayList();
  •   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)
  •   */
  •   publicvoid 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
  •   */
  •   publicvoid 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());
  •   }
  •   /**
  •   * 按数组位置更新文档(查询条件需要包含更新内容,$为数组位置占位符,只更新匹配到的第一个文档.)
  •   */
  •   publicvoid 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)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-626958-1-1.html 上篇帖子: mongodb numa问题 下篇帖子: Memcached、MongoDB、Redis和tokyotyrant
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表