【IT168 专稿】在上一篇文章中,我们学习了Mongodb的安装和初步使用,在本文中,将学习如何使用Java去编程实现对Mongodb的操作。

  HelloWorld程序

  学习任何程序的第一步,都是编写HelloWorld程序,我们也不例外,看下如何通过Java编写一个HelloWorld的程序。

  首先,要通过Java操作Mongodb,必须先下载Mongodb的Java驱动程序,可以在这里下载

  新建立一个Java工程,将下载的驱动程序放在库文件路径下,程序代码如下:

);             // 使用collection的find方法查找document            DBCursor cursor = collection.find(searchQuery);             //循环输出结果            while (cursor.hasNext()) {             System.out.println(cursor.next());             }             System.out.println("Done");          } catch (UnknownHostException e) {             e.printStackTrace();         } catch (MongoException e) {             e.printStackTrace();         }     } }

  最后,输出的结果为:

 , "msg" : "hello world mongoDB in Java"} Done

  在上面的例子中,演示了使用Java对Mongodb操作的重要方法和步骤,首先通过创建Mongodb对象,传入构造函数的参数是Mongodb的数据库所在地址和端口,然后使用

  getDB方法获得要连接的数据库名,使用getCollection获得数据集合的名,然后通过新建立BasicDBObject对象去建立document,最后通过collection的insert方法,将建立的document保存到数据库中去。而collection的find方法,则是用来在数据库中查找document。

  从Mongodb中获得collection数据集

  在Mongodb中,可以通过如下方法获得数据库中的collection:

  DBCollection collection = db.getCollection("yourCollection");

  如果你不知道collection的名称,可以使用db.getCollectionNames()获得集合,然后再遍历,如下:

  DB db = mongo.getDB("yourdb");   Set collections = db.getCollectionNames();   for(String collectionName : collections){   System.out.println(collectionName);   }

  完成的一个例子如下:

); DB db = mongo.getDB("yourdb"); Set<String> collections = db.getCollectionNames(); for (String collectionName : collections) { System.out.println(collectionName); } DBCollection collection = db.getCollection("yourCollection"); System.out.println(collection.toString()); System.out.println("Done");
} catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace(); } } }

  Mongodb中如何插入数据

  下面,讲解下如何使用4种方式,将JSON数据插入到Mongodb中去。首先我们准备JSON

  格式的数据,如下:

,   index : "vps_index1",   active : "true"   }   }   }

  我们希望用不同的方式,通过JAVA代码向Mongodb插入以上格式的JSON数据

  第一种方法,是使用BasicDBObject,方法如下代码所示:

"); documentDetail.put("index", "vps_index1"); documentDetail.put("active", "true"); document.put("detail", documentDetail); collection.insert(document);

  第二种方法是使用BasicDBObjectBuilder对象,如下代码所示:

")   .add("index", "vps_index1")   .add("active", "true");   documentBuilder.add("detail", documentBuilderDetail.get());   collection.insert(documentBuilder.get());

  第三种方法是使用Map对象,代码如下:

");   documentMapDetail.put("index", "vps_index1");   documentMapDetail.put("active", "true");   documentMap.put("detail", documentMapDetail);   collection.insert(new BasicDBObject(documentMap));

  第四种方法,也就是最简单的,即直接插入JSON格式数据

  String json ="{'database' : 'mkyongDB','table' : 'hosting',"+   "'detail' : {'records' : 99, 'index' : 'vps_index1', 'active' : 'true'}}}";   DBObject dbObject =(DBObject)JSON.parse(json);   collection.insert(dbObject);

  这里使用了JSON的parse方法,将解析后的JSON字符串转变为DBObject对象后再直接插入到collection中去。

  完整的代码如下所示:

");   documentMapDetail.put("index", "vps_index1");   documentMapDetail.put("active", "true");   documentMap.put("detail", documentMapDetail);   collection.insert(new BasicDBObject(documentMap));   DBCursor cursorDocMap = collection.find();   while(cursorDocMap.hasNext()){   System.out.println(cursorDocMap.next());   }   collection.remove(new BasicDBObject());   // JSON parse example  System.out.println("JSON parse example...");   String json ="{'database' : 'mkyongDB','table' : 'hosting',"+   "'detail' : {'records' : 99, 'index' : 'vps_index1', 'active' : 'true'}}}";   DBObject dbObject =(DBObject)JSON.parse(json);   collection.insert(dbObject);   DBCursor cursorDocJSON = collection.find();   while(cursorDocJSON.hasNext()){   System.out.println(cursorDocJSON.next());   }   collection.remove(new BasicDBObject());   }catch(UnknownHostException e){   e.printStackTrace();   }catch(MongoException e){   e.printStackTrace();   }   }   }

  更新Document

  假设如下的JSON格式的数据已经保存到Mongodb中去了,现在要更新相关的数据。

}

  假设现在要将hosting中值为hostB的进行更新,则可以使用如下的方法:

);   collection.update(new BasicDBObject().append("hosting", "hostB"), newDocument);

  可以看到,这里依然使用了BasicDBObject对象,并为其赋值了新的值后,然后使用collection的update方法,即可更新该对象。

  更新后的输出如下:

}

  另外,还可以使用mongodb中的$inc修饰符号去对某个值进行更新,比如,要将hosting值为hostB的document的clients的值得更新为199(即100+99=199),可以这样:

));   collection.update(new BasicDBObject().append("hosting", "hostB"), newDocument);

  则输出如下:

}

  接下来,讲解$set修饰符的使用。比如要把hosting中值为hostA的document中的

  type的值进行修改,则可以如下实现:

  BasicDBObject newDocument3 =new BasicDBObject().append("$set",   new BasicDBObject().append("type", "dedicated server"));   collection.update(new BasicDBObject().append("hosting", "hostA"), newDocument3);

  则输出如下,把type的值从vps改为dedicated server:

 , "type" : "dedicated server"}

  要注意的是,如果不使用$set的修饰符,而只是如下代码:

  BasicDBObject newDocument3 =new BasicDBObject().append("type", "dedicated server");   collection.update(new BasicDBObject().append("hosting", "hostA"), newDocument3);

  则会将所有的三个document的type类型都改为dedicated server了,因此要使用$set以更新特定的document的特定的值。

  如果要更新多个document中相同的值,可以使用$multi,比如,要把所有vps为type的document,将它们的clients的值更新为888,可以如下实现:

"));   collection.update(new BasicDBObject().append("type", "vps"), updateQuery, false, true);

  输出如下:

" , "type" : "vps"}

  最后,还是给出更新document的完整例子:

"));   collection.update(   new BasicDBObject().append("type", "vps"), updateQuery, false, true);   printAllDocuments(collection);   removeAllDocuments(collection);   System.out.println("Done");   } catch (UnknownHostException e) {   e.printStackTrace();   } catch (MongoException e) {   e.printStackTrace();   }   }   }

  查询Document

  下面学习如何查询document,先用下面的代码往数据库中插入1-10数字:

; i++){   collection.insert(new BasicDBObject().append("number", i));
  }

  接下来,看下如下的例子:

  1) 获得数据库中的第一个document:

  DBObject doc = collection.findOne();   System.out.println(dbObject);

  输出为:

}

  2)获得document的集合

  DBCursor cursor = collection.find();   while(cursor.hasNext()){   System.out.println(cursor.next());   }

  这里,使用collection.find()方法,获得当前数据库中所有的documents对象集合

  然后通过对DBCursor对象集合的遍历,即可输出当前所有documents。输出如下:

}

  3) 获取指定的document

  比如要获得number=5的document对象内容,可以使用collection的find方法即可,如下:

);   DBCursor cursor = collection.find(query);   while(cursor.hasNext()){   System.out.println(cursor.next());   }

  即输出:

}

  4) 使用in操作符号

  在mongodb中,也可以使用in操作符,比如要获得number=9和number=10的document对象,可以如下操作:

);   query.put("number", new BasicDBObject("$in", list));   DBCursor cursor = collection.find(query);   while(cursor.hasNext()){   System.out.println(cursor.next());   }

  这里使用了一个List,并将list传入到BasicDBObject的构造函数中,并使用了in操作符号,输出如下:

}

  5) 使用>,<等比较符号

  在mongodb中,也可以使用比如>,<等数量比较符号,比如要输出number>5的document集合,则使用“$gt”即可,同理,小于关系则使用$lt,例子如下:

));   DBCursor cursor = collection.find(query);   while(cursor.hasNext()){   System.out.println(cursor.next());   }

  输出如下:

));   DBCursor cursor = collection.find(query);   while(cursor.hasNext()){   System.out.println(cursor.next());   }

  同样,如果是不等于的关系的话,可以使用$ne操作符,如下:

));   DBCursor cursor6 = collection.find(query5);   while(cursor6.hasNext()){   System.out.println(cursor6.next());   }

  以上输出number=8之外的所有document。

  删除document

  下面我们学习如何删除document,依然以上面的已插入的1-10的documents集合为例说明:

  1) 删除第一个document

  DBObject doc = collection.findOne();   collection.remove(doc);

  2) 删除指定的document

  比如删除number=2的document,如下方法:

);   collection.remove(document);

  要注意的是,如下的方法将只会删除number=3的document。

);   collection.remove(document);

  3) 使用in 操作符号指定删除document

  下面的例子将同时删除number=4和number=5的document,使用的是in操作符

);   query2.put("number", new BasicDBObject("$in", list));   collection.remove(query2);

  4) 使用“$gt”删除大于某个值的document

));   collection.remove(query);

  以上会删除number=10的document。

  5) 删除所有的document

  DBCursor cursor = collection.find();   while(cursor.hasNext()){   collection.remove(cursor.next());   }

  保存图片到Mongodb

  下面将讲解如何使用Java MongoDB GridFS API去保存图片等二进制文件到Monodb,关于Java MongoDB GridFS API的详细论述,请参考http://www.mongodb.org/display/DOCS/GridFS+Specification

  1)保存图片

  代码段如下:

  String newFileName ="mkyong-java-image";   File imageFile =newFile("c:\\JavaWebHosting.png");   GridFS gfsPhoto =new GridFS(db, "photo");   GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);   gfsFile.setFilename(newFileName);   gfsFile.save();

  这里,将c盘下的JavaWebHosting.png保存到mongodb中去,并命名为mkyong-java-image。

  2) 读取图片信息

  代码段如下

  String newFileName ="mkyong-java-image";   GridFS gfsPhoto =new GridFS(db, "photo");   GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);   System.out.println(imageForOutput);

  将会输出JSON格式的结果;

 ,   "md5" : "1462a6cfa27669af1d8d21c2d7dd1f8b" ,   "filename" : "mkyong-java-image" ,   "contentType" : null ,   "uploadDate" :   {   "$date" : "2011-05-10T14:52:10Z"   } ,   "aliases" : null   }

  可以看到,输出的是文件的属性相关信息。

  3) 输出已保存的所有图片

  下面代码段,输出所有保存在photo命名空间下的图片信息:

  GridFS gfsPhoto =new GridFS(db, "photo");   DBCursor cursor = gfsPhoto.getFileList();   while(cursor.hasNext()){   System.out.println(cursor.next());   }

  4) 从数据库中读取一张图片并另存

  下面的代码段,从数据库中读取一张图片并另存为另外一张图片到磁盘中

  String newFileName ="mkyong-java-image";   GridFS gfsPhoto =new GridFS(db, "photo");   GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);   imageForOutput.writeTo("c:\\JavaWebHostingNew.png");

  5) 删除图片

  String newFileName ="mkyong-java-image";   GridFS gfsPhoto =new GridFS(db, "photo");   gfsPhoto.remove(gfsPhoto.findOne(newFileName));

  如何将JSON数据格式转化为DBObject格式

  在mongodb中,可以使用com.mongodb.util.JSON类,将JSON格式的字符串转变为DBObject对象。MongoDB for JAVA驱动中提供了用于向数据库中存储普通对象的接口DBObject,当一个文档从MongoDB中取出时,它会自动把文档转换成DBObject接口类型,要将它实例化为需要的对象。比如:

  }

  这样的JSON格式字符串,转换方法为:

  DBObject dbObject =(DBObject) JSON.parse("{'name':'mkyong', 'age':30}");

  完整的代码如下:

);   DB db = mongo.getDB("yourdb");   DBCollection collection = db.getCollection("dummyColl");   DBObject dbObject =(DBObject) JSON   .parse("{'name':'mkyong', 'age':30}");   collection.insert(dbObject);   DBCursor cursorDoc = collection.find();   while(cursorDoc.hasNext()){   System.out.println(cursorDoc.next());   }   System.out.println("Done");   }catch(UnknownHostException e){   e.printStackTrace();   }catch(MongoException e){   e.printStackTrace();   }   }   }

  则输出为:

}
  Done

  可以看到,将JSON格式的数据类型直接转换为mongodb中的文档类型并输出。

  小结:

  本文学习了如何使用Mongodb for JAVA驱动,对mongodb进行日常的数据库操作,比如增加,删除和修改,下一篇教程中,将指导学习Spring对mongodb的操作

Mongodb快速入门之使用Java操作Mongodb的更多相关文章

  1. Mongodb入门并使用java操作Mongodb

    转载请注意出处:http://blog.csdn.net/zcm101 最近在学习NoSql,先从Mongodb入手,把最近学习的总结下. Mongodb下载安装 Mongodb的下载安装就不详细说了 ...

  2. JAVA操作MongoDB数据库

    1. 首先,下载MongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads 2.Java操作Mo ...

  3. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  4. MongoDb 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...

  5. MongoDB快速入门指南与docker-compose快体验

    MongoDB快速入门指南与docker-compose快体验 MongoDB相对于RDBMS的优势 模式少 -MongoDB是一个文档数据库,其中一个集合包含不同的文档.一个文档之间的字段数,内容和 ...

  6. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  7. [转]MongoDB for Java】Java操作MongoDB

    原文地址: MongoDB for Java]Java操作MongoDB 开发环境: System:Windows IDE:eclipse.MyEclipse 8 Database:mongoDB 开 ...

  8. Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html 介绍到了在MongoDB的控制台完成MongoDB的数据操作,通 ...

  9. 浅谈如何用Java操作MongoDB

    NoSQL数据库因其可扩展性使其变得越来越流行,利用NoSQL数据库可以给你带来更多的好处,MongoDB是一个用C++编写的可度可扩展性的开源NoSQL数据库.本文主要讲述如何使用Java操作Mon ...

随机推荐

  1. Mac OS X 开启SSH服务

    系统偏好设置-->共享 没解锁的解个锁 选中远程登录&允许所有用户 若要远程登录这台电脑, 请键入 ssh 要登录的用户名@ip地址或电脑名,例:ssh zhanghua@applede ...

  2. CSS远程加载字体

    CSS 远程加载字体的方法,做网站CSS的都知道,用户浏览网站时,网页上的字体是加载本地的.换言之,如果网站使用了用户电脑所没有安装的字体,那显示字体就会被默认字体所代替了,自然效果就大受影响了. 上 ...

  3. readline函数分析

    函数功能:提示用户输入命令,并读取命令/****************************************************************************/ /* ...

  4. study note -(some good sentence)

    There are, however, some disadvantages.However, there may be better ways of tacking this problem. Ho ...

  5. BZOJ 1296 粉刷匠

    Description windy有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. ...

  6. BZOJ 1037 生日聚会

    Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件: ...

  7. Web NFC API

    W3C Editor's Draft 29 December 2014 This version: http://www.w3.org/2012/nfc/web-api/ Latest publish ...

  8. Jersey Politics

    poj2454:http://poj.org/problem?id=2454 题意:给你3*k个数,然后让你分成三堆,使得至少其中的两堆中的数字之和大于500*k.题解:这道题一开始我并不知道怎么做, ...

  9. Rabbit hunt

    poj2606:http://poj.org/problem?id=2606 给你n个点,求在一条直线上的点最多有几个.题解:直接暴力,但是要注意,横坐标相等的情况,这是不能求斜力,只能特殊处理. # ...

  10. Parencodings

    Description Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two diff ...