欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

使用Java操作MongoDB

程序员文章站 2024-02-10 19:43:49
...

HelloWorld程序 学习任何程序的第一步,都是编写HelloWorld程序,我们也不例外,看下如何通过Java编写一个HelloWorld的程序。 首先,要通过Java操作Mongodb,必须先下载Mongodb的Java驱动程序,可以在这里下载。 新建立一个Java工程,将下载的驱动程序放在库

HelloWorld程序

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

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

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

package?com.mkyong.core;

import?java.net.UnknownHostException;

import?com.mongodb.BasicDBObject;

import?com.mongodb.DB;

import?com.mongodb.DBCollection;

import?com.mongodb.DBCursor;

import?com.mongodb.Mongo;

import?com.mongodb.MongoException;



/**

* Java + MongoDB Hello world Example

*?

*/

public?class?App {

public?static?void?main(String[] args) {

try?{

//实例化Mongo对象,连接27017端口

????????????Mongo mongo?=?new?Mongo(“localhost”,?27017);

//连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立

????????????DB db?=?mongo.getDB(“yourdb”);

//?Get collection from MongoDB, database named “yourDB”

//从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立

????????????DBCollection collection?=?db.getCollection(“yourCollection”);

//?使用BasicDBObject对象创建一个mongodb的document,并给予赋值。

????????????BasicDBObject document?=?new?BasicDBObject();

document.put(“id”,?1001);

document.put(“msg”,?”hello world mongoDB in Java”);

//将新建立的document保存到collection中去

????????????collection.insert(document);

//?创建要查询的document

????????????BasicDBObject searchQuery?=?new?BasicDBObject();

searchQuery.put(“id”,?1001);

//?使用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();

}

}

}

  最后,输出的结果为:

{?”_id”?: {?”$oid”?:?”4dbe5596dceace565d229dc3″} ,?

“id”?:?1001?,?”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);

}

  完成的一个例子如下:

package?com.mkyong.core;

import?java.net.UnknownHostException;

import?java.util.Set;

import?com.mongodb.DB;

import?com.mongodb.DBCollection;

import?com.mongodb.Mongo;

import?com.mongodb.MongoException;

/**

* Java : Get collection from MongoDB

*?

*/

public?class?GetCollectionApp {

public?static?void?main(String[] args) {

try?{

Mongo mongo?=?new?Mongo(“localhost”,?27017);

DB db?=?mongo.getDB(“yourdb”);

Set?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

  格式的数据,如下:

  {

“database”?:?”mkyongDB”,

“table”?:?”hosting”,

“detail”?:

{

records :?99,

index :?”vps_index1″,

active :?”true”

}

}

}

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

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

BasicDBObject document?=?new?BasicDBObject();

document.put(“database”,?”mkyongDB”);

document.put(“table”,?”hosting”);

BasicDBObject documentDetail?=?new?BasicDBObject();

documentDetail.put(“records”,?”99″);

documentDetail.put(“index”,?”vps_index1″);

documentDetail.put(“active”,?”true”);

document.put(“detail”, documentDetail);

collection.insert(document);

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

  BasicDBObjectBuilder documentBuilder?=?BasicDBObjectBuilder.start()

.add(“database”,?”mkyongDB”)

.add(“table”,?”hosting”);

BasicDBObjectBuilder documentBuilderDetail?=?BasicDBObjectBuilder.start()

.add(“records”,?”99″)

.add(“index”,?”vps_index1″)

.add(“active”,?”true”);

documentBuilder.add(“detail”, documentBuilderDetail.get());

collection.insert(documentBuilder.get());

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

  Map documentMap?=new?HashMap();

documentMap.put(“database”,?”mkyongDB”);

documentMap.put(“table”,?”hosting”);

Map documentMapDetail?=new?HashMap();

documentMapDetail.put(“records”,?”99″);

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中去。

  完整的代码如下所示:

  packagecom.mkyong.core;

importjava.net.UnknownHostException;

importjava.util.HashMap;

importjava.util.Map;

importcom.mongodb.BasicDBObject;

importcom.mongodb.BasicDBObjectBuilder;

importcom.mongodb.DB;

importcom.mongodb.DBCollection;

importcom.mongodb.DBCursor;

importcom.mongodb.DBObject;

importcom.mongodb.Mongo;

importcom.mongodb.MongoException;

importcom.mongodb.util.JSON;

/**

* Java MongoDB : Insert a Document

*

*/

publicclass InsertDocumentApp {

publicstaticvoid main(String[] args){

try{

Mongo mongo?=new?Mongo(“localhost”,?27017);

DB db?=?mongo.getDB(“yourdb”);

//?get a single collection

  DBCollection collection?=?db.getCollection(“dummyColl”);

//?BasicDBObject example

  System.out.println(“BasicDBObject example…”);

BasicDBObject document?=new?BasicDBObject();

document.put(“database”,?”mkyongDB”);

document.put(“table”,?”hosting”);

BasicDBObject documentDetail?=new?BasicDBObject();

documentDetail.put(“records”,?”99″);

documentDetail.put(“index”,?”vps_index1″);

documentDetail.put(“active”,?”true”);

document.put(“detail”, documentDetail);

collection.insert(document);

DBCursor cursorDoc?=?collection.find();

while(cursorDoc.hasNext()){

System.out.println(cursorDoc.next());

}

collection.remove(new?BasicDBObject());

//?BasicDBObjectBuilder example

  System.out.println(“BasicDBObjectBuilder example…”);

BasicDBObjectBuilder documentBuilder?=?BasicDBObjectBuilder.start()

.add(“database”,?”mkyongDB”)

.add(“table”,?”hosting”);

BasicDBObjectBuilder documentBuilderDetail?=?BasicDBObjectBuilder.start()

.add(“records”,?”99″)

.add(“index”,?”vps_index1″)

.add(“active”,?”true”);

documentBuilder.add(“detail”, documentBuilderDetail.get());

collection.insert(documentBuilder.get());

DBCursor cursorDocBuilder?=?collection.find();

while(cursorDocBuilder.hasNext()){

System.out.println(cursorDocBuilder.next());

}

collection.remove(new?BasicDBObject());

//?Map example

  System.out.println(“Map example…”);

Map documentMap?=new?HashMap();

documentMap.put(“database”,?”mkyongDB”);

documentMap.put(“table”,?”hosting”);

Map documentMapDetail?=new?HashMap();

documentMapDetail.put(“records”,?”99″);

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中去了,现在要更新相关的数据。

  {“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostA”?,?”type”?:?”vps”?,?”clients”?:?1000}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostB”?,?”type”?:?”dedicated server”?,?”clients”?:?100}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostC”?,?”type”?:?”vps”?,?”clients”?:?900}

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

  BasicDBObject newDocument?=new?BasicDBObject();

newDocument.put(“hosting”,?”hostB”);

newDocument.put(“type”,?”shared host”);

newDocument.put(“clients”,?111);

collection.update(new?BasicDBObject().append(“hosting”,?”hostB”), newDocument);

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

  更新后的输出如下:

  {“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostA”?,?”type”?:?”vps”?,?”clients”?:?1000}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostB”?,?”type”?:?”shared host”?,?”clients”?:?111}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostC”?,?”type”?:?”vps”?,?”clients”?:?900}

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

  BasicDBObject newDocument?=new?BasicDBObject().append(“$inc”,

new?BasicDBObject().append(“clients”,?99));

collection.update(new?BasicDBObject().append(“hosting”,?”hostB”), newDocument);

?  则输出如下:

  {“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostA”?,?”type”?:?”vps”?,?”clients”?:?1000}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostB”?,?”type”?:?”dedicated server”?,?”clients”?:?199}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostC”?,?”type”?:?”vps”?,?”clients”?:?900}

?  接下来,讲解$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:

  {“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostB”?,?”type”?:?”dedicated server”?,?”clients”?:?100}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostC”?,?”type”?:?”vps”?,?”clients”?:?900}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostA”?,?”clients”?:?1000?,?”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,可以如下实现:

  BasicDBObject updateQuery?=new?BasicDBObject().append(“$set”,

new?BasicDBObject().append(“clients”,?”888″));

collection.update(new?BasicDBObject().append(“type”,?”vps”), updateQuery,?false,?true);

  输出如下:

  {“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostA”?,?”clients”?:?”888″?,?”type”?:?”vps”}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostB”?,?”type”?:?”dedicated server”?,?”clients”?:?100}

{“_id”?: {“$oid”?:?”x”} ,?”hosting”?:?”hostC”?,?”clients”?:?”888″?,?”type”?:?”vps”}

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

  package?com.liao;

import?java.net.UnknownHostException;

import?com.mongodb.BasicDBObject;

import?com.mongodb.DB;

import?com.mongodb.DBCollection;

import?com.mongodb.DBCursor;

import?com.mongodb.Mongo;

import?com.mongodb.MongoException;

publicclass UpdateDocumentApp {

publicstaticvoid printAllDocuments(DBCollection collection){

DBCursor cursor?=?collection.find();

while?(cursor.hasNext()) {

System.out.println(cursor.next());

}

}

publicstaticvoid removeAllDocuments(DBCollection collection){

collection.remove(new?BasicDBObject());

}

publicstaticvoid insertDummyDocuments(DBCollection collection){

BasicDBObject document?=?new?BasicDBObject();

document.put(“hosting”,?”hostA”);

document.put(“type”,?”vps”);

document.put(“clients”,?1000);

BasicDBObject document2?=?new?BasicDBObject();

document2.put(“hosting”,?”hostB”);

document2.put(“type”,?”dedicated server”);

document2.put(“clients”,?100);

BasicDBObject document3?=?new?BasicDBObject();

document3.put(“hosting”,?”hostC”);

document3.put(“type”,?”vps”);

document3.put(“clients”,?900);

collection.insert(document);

collection.insert(document2);

collection.insert(document3);

}

publicstaticvoid main(String[] args) {

try?{

Mongo mongo?=?new?Mongo(“localhost”,?27017);

DB db?=?mongo.getDB(“yourdb”);

DBCollection collection?=?db.getCollection(“dummyColl”);

System.out.println(“Testing 1…”);

insertDummyDocuments(collection);

//find hosting = hostB, and update it with new document

  BasicDBObject newDocument?=?new?BasicDBObject();

newDocument.put(“hosting”,?”hostB”);

newDocument.put(“type”,?”shared host”);

newDocument.put(“clients”,?111);

collection.update(new?BasicDBObject().append(“hosting”,?”hostB”), newDocument);

printAllDocuments(collection);

removeAllDocuments(collection);

System.out.println(“Testing 2…”);

insertDummyDocuments(collection);

BasicDBObject newDocument2?=?new?BasicDBObject().append(“$inc”,

new?BasicDBObject().append(“clients”,?99));

collection.update(new?BasicDBObject().append(“hosting”,?”hostB”), newDocument2);

printAllDocuments(collection);

removeAllDocuments(collection);

System.out.println(“Testing 3…”);

insertDummyDocuments(collection);

BasicDBObject newDocument3?=?new?BasicDBObject().append(“$set”,

new?BasicDBObject().append(“type”,?”dedicated server”));

collection.update(new?BasicDBObject().append(“hosting”,?”hostA”), newDocument3);

printAllDocuments(collection);

removeAllDocuments(collection);

System.out.println(“Testing 4…”);

insertDummyDocuments(collection);

BasicDBObject updateQuery?=?new?BasicDBObject().append(“$set”,

new?BasicDBObject().append(“clients”,?”888″));

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数字:

  for(int?i=1; i?
collection.insert(new?BasicDBObject().append(“number”, i));



}

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

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

  DBObject doc?=?collection.findOne();

System.out.println(dbObject);

?  输出为:

  {“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80bd”} ,?”number”?:?1}

?  2)获得document的集合

  DBCursor cursor?=?collection.find();

while(cursor.hasNext()){

System.out.println(cursor.next());

}

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

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

  {“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80bd”} ,?”number”?:?1}

//……….中间部分省略,为2到9的输出

  {“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c6″} ,?”number”?:?10}

?  3) 获取指定的document

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

  BasicDBObject query?=new?BasicDBObject();

query.put(“number”,?5);

DBCursor cursor?=?collection.find(query);

while(cursor.hasNext()){

System.out.println(cursor.next());

}

?  即输出:

  {“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c1″} ,?”number”?:?5}

?  4) 使用in操作符号

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

  BasicDBObject query?=new?BasicDBObject();

List list?=new?ArrayList();

list.add(9);

list.add(10);

query.put(“number”,?new?BasicDBObject(“$in”, list));

DBCursor cursor?=?collection.find(query);

while(cursor.hasNext()){

System.out.println(cursor.next());

}

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

  {“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c5″} ,?”number”?:?9}

{“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c6″} ,?”number”?:?10}

  5) 使用>,

  在mongodb中,也可以使用比如>,5的document集合,则使用“$gt”即可,同理,小于关系则使用$lt,例子如下:

  BasicDBObject query?=new?BasicDBObject();

query.put(“number”,?new?BasicDBObject(“$gt”,?5));

DBCursor cursor?=?collection.find(query);

while(cursor.hasNext()){

System.out.println(cursor.next());

}

?  输出如下:

  {“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c2″} ,?”number”?:?6}

{“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c3″} ,?”number”?:?7}

{“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c4″} ,?”number”?:?8}

{“_id”?: {“$oid”?:?”4dc7f7b7bd0fb9a86c6c80c5″} ,?”number”?:?9}

{“_id”?: {“$oid”?:?”4dc7f7b7