您的位置:首页 > 数据库 > Mongodb

Mongodb java 例子

2014-01-05 20:09 295 查看
该文档是翻译自文档[mongodb-docs-2010-10-24.pdf]的[Java Language Center]章节,根据自己的理解整理而成。

希望能给像我这样开始接触的朋友一点帮助,同时也做个备忘,因为是刚刚学习,其中的很多功能目前都用不上,以后万一有什么功能不太清楚,也可以直接查阅该文档了。

MongoDB Java Driver 简单操作

一、Java驱动一致性

MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个)。

对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,我们可以用以下方式保证一致性:

Java代码








DB mdb = mongo.getDB('dbname');

mdb.requestStart();
//
// 业务代码
//
mdb.requestDone();

DB mdb = mongo.getDB('dbname'); 

mdb.requestStart(); 
// 
// 业务代码 
// 
mdb.requestDone();


DB和DBCollection是绝对线程安全的,它们被缓存起来了,所以在应用中取到的可能是同一个对象。

二、保存/查找对象(DBObject)

Java驱动提供了DBObject接口,方便我们保存对象到数据库中。

定义需要保存的对象:

public class Tweet implements DBObject {

/** ...... */

}

然后我们可以使用该对象:

Java代码








Tweet tweet = new Tweet();
tweet.put("user", userId);
tweet.put("message", message);
tweet.put("date", new Date());

collection.insert(tweet);

Tweet tweet = new Tweet(); 
tweet.put("user", userId); 
tweet.put("message", message); 
tweet.put("date", new Date()); 

collection.insert(tweet);
当从数据库中查询时,结果会自动的转换成DBObject对象,我们可以转换成我们自己的类型:

Java代码








collection.setObjectClass(Tweet);

Tweet myTweet = (Tweet)collection.findOne();

collection.setObjectClass(Tweet); 

Tweet myTweet = (Tweet)collection.findOne();


三、创建连接

Java代码








Mongo m = new Mongo();
Mongo m = new Mongo("localhost");
Mongo m = new Mongo("localhost", 27017);

DB db = m.getDB("mydb);

Mongo m = new Mongo(); 
Mongo m = new Mongo("localhost"); 
Mongo m = new Mongo("localhost", 27017); 

DB db = m.getDB("mydb);


注意:事实上,Mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个Mongo实例对我们来说已经足够了。

四、认证(可选的)

boolean auth = db.authenticate("myUserName", "myPasswd");

五、取得Collection列表

Java代码








Set<String> colls = db.getCollectionNames();

for(String s : colls) {
System.out.prinln(s);
}

Set<String> colls = db.getCollectionNames(); 

for(String s : colls) { 
  System.out.prinln(s); 
}


六、获取一个Collection

DBCollection coll = db.getCollection("testCollection");

使用DBCollection,我们可以进行插入、查询数据等数据操作。

七、插入文档

假设有个JSON文档如下所示:

{

"name": "MongoDB",

"type": "database",

"count": 1,

"info": {

x: 203,

y: 102

}

}

注意:上面的JSON文档有个内嵌文档"info"。

我们完全可以利用BasicDBObject来创建一个和上面的JSON一样的文档,并且把它保存在MongoDB中。

Java代码








DBObject doc = new BasicDBObject();

doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", 1);

DBObject info = new BasicDBObject();
info.put("x", 203);
info.put("y", 102);

doc.put("info", info);

coll.insert(doc);

DBObject doc = new BasicDBObject(); 

doc.put("name", "MongoDB"); 
doc.put("type", "database"); 
doc.put("count", 1); 

DBObject info = new BasicDBObject(); 
info.put("x", 203); 
info.put("y", 102); 

doc.put("info", info); 

coll.insert(doc);
八、查询第一个文档(findOne())

为了验证在上面我们保存的类似JSON的数据,我们可以用findOne()方法取得数据。

findOne(): 返回一个文档;

find(): 返回一个游标(DBCursor),其中包含一组对象DBObject;

DBObject doc = coll.findOne();

System.out.println(doc);

我们将会看到控制台输出:

{ "_id" : "49902cde5162504500b45c2c" , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102} , "_ns" : "testCollection"}

九、插入多个文档

为了在后来展示更多的查询方法,我们先插入几个文档,它们的JSON像这样:

{

"i": value

}

使用一个循环插入数据:

Java代码








for(int i = 0; i < 100; i++) {
coll.insert(new BasicDBObject().append("i", i));
}

for(int i = 0; i < 100; i++) { 
  coll.insert(new BasicDBObject().append("i", i)); 
}


我们注意到,同一个coll,我们完全可以插入不同风格的数据,这就是MongoDB的重要特性“模式自由”。

十、统计文档数

现在我们已经有101份文档在数据库中了,现在统计一下看是否正确。

Java代码








long count = coll.getCount();
System.out.println(count);

long count = coll.getCount(); 
System.out.println(count);
控制台将会输出:101

十一、使用游标取得所有的文档

Java代码








DBCursor cursor = coll.find();

while(cursor.hasNext()) {
DBObject object = cursor.next();
System.out.println(object);
}

DBCursor cursor = coll.find(); 

while(cursor.hasNext()) { 
  DBObject object = cursor.next(); 
  System.out.println(object); 
}
十二、查询单个文档

Java代码








DBObject query = new BasicDBObject();

query.put("i", 71);

cursor = coll.find(query);

while(cur.hasNext()) {
DBObject object = cursor.next();
System.out.println(object);
}

DBObject query = new BasicDBObject(); 

query.put("i", 71); 

cursor = coll.find(query); 

while(cur.hasNext()) { 
  DBObject object = cursor.next(); 
  System.out.println(object); 
}
控制台的输出类似如下:

{ "_id" : "49903677516250c1008d624e" , "i" : 71 , "_ns" : "testCollection"}

十三、查询文档集合

根据查询条件,我们可以通过DBCollection从数据库中取出多个对象,比如查询i>50的文档集合:

Java代码








query = new BasicDBObject();

query.put("i", new BasicDBObject("$gt", 50)); // i>50


cursor = coll.find(query);

while(cursor.hasNext()) {
DBObject object = cursor.next();
System.out.println(object);
}

query = new BasicDBObject(); 

query.put("i", new BasicDBObject("$gt", 50)); // i>50 

cursor = coll.find(query); 

while(cursor.hasNext()) { 
  DBObject object = cursor.next(); 
  System.out.println(object); 
}
比如查询条件为 20<i<=30:

Java代码








query = new BasicDBObject();

// 20<i<=30
query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));

cursor = coll.find(query);

while(cursor.hasNext()) {
DBObject object = cursor.next();
System.out.println(object);
}

query = new BasicDBObject(); 

// 20<i<=30 
query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30)); 

cursor = coll.find(query); 

while(cursor.hasNext()) { 
  DBObject object = cursor.next(); 
  System.out.println(object); 
}


十四、创建索引

MongoDB支持索引,并且给一个DBCollection添加索引非常简单,你只要指明需要创建索引的字段,然后指明其是升序(1)还是降序(-1)即可,比如在"i"上创建升序索引。

coll.createIndex(new BasicDBObject("i", 1)); // 1代表升序

十五、查询索引

我们可以查询到所有的索引:

Java代码








List<DBObject> list = coll.getIndexInfo();

for(DBObject index : list){
System.out.println(index);
}

List<DBObject> list = coll.getIndexInfo(); 

for(DBObject index : list){ 
  System.out.println(index); 
}
控制台的输出类似如下所示:

{ "name" : "i_1" , "ns" : "mydb.testCollection" , "key" : { "i" : 1} , "_ns" : "system.indexes"}

MongoDB的管理功能



一、获取所有的数据库

Java代码








Mongo m = new Mongo();

for(String s : m.getDatabaseNames()) {
System.out.println(s);
}

Mongo m = new Mongo(); 

for(String s : m.getDatabaseNames()) { 
  System.out.println(s); 
}


二、删除数据库

m.dropDatabase("my_new_db");

MongoDB的Java类型

一、对象ID

ObjectId被用作自动生成的唯一ID.

Java代码








ObjectId id = new ObjectId();
ObjectId copy = new ObjectId(id);

ObjectId id = new ObjectId(); 
ObjectId copy = new ObjectId(id);
二、正则表达式

Java代码








Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);
DBObject query = new BasicDBObject("name", john);

Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE); 
DBObject query = new BasicDBObject("name", john);


// 查询所有 "name" 匹配 /joh?n/i 的文档

DBCursor cursor = collection.find(query);

三、日期和时间

Java代码








Date now = new Date();
DBObject time = new BasicDBObject("ts", now);

collection.save(time);

Date now = new Date(); 
DBObject time = new BasicDBObject("ts", now); 

collection.save(time);


四、数据库引用

DBRef可以用来保存数据库引用。

Java代码








DBRef addressRef = new DBRef(db, "foo.bar", address_id);
DBObject address = addressRef.fetch();

DBObject person = BasicDBObjectBuilder.start()
.add("name", "Fred")
.add("address", addressRef)
.get();
collection.save(person);

DBObject fred = collection.findOne();
DBRef addressObj = (DBRef)fred.get("address");
addressObj.fetch();

DBRef addressRef = new DBRef(db, "foo.bar", address_id); 
DBObject address = addressRef.fetch(); 

DBObject person = BasicDBObjectBuilder.start() 
  .add("name", "Fred") 
  .add("address", addressRef) 
  .get(); 
collection.save(person); 

DBObject fred = collection.findOne(); 
DBRef addressObj = (DBRef)fred.get("address"); 
addressObj.fetch();


五、二进制数据

字节数组(byte[])被当作二进制数据。

六、内嵌文档

JSON样式的数据如下:

{

"x": {

"y": 3

}

}

则在MongoDB中,Java表示为:

Java代码








DBObject y = new BasicDBObject("y", 3);
DBObject x = new BasicDBObject("x", y);

DBObject y = new BasicDBObject("y", 3); 
DBObject x = new BasicDBObject("x", y);
七、数组

任何继承自List的对象,在MongoDB中,都被当成是数组。

如果想表示如下JSON数据:

Java代码








{
"x": [
1,
2,
{"foo": "bar"},
4
]
}

{ 
  "x": [ 
   1, 
   2, 
   {"foo": "bar"}, 
   4 
  ] 
}


则在Java中,应该为:

Java代码








List<Object> x = new ArrayList<Object>();
x.add(1);
x.add(2);
x.add(new BasicDBObject("foo", "bar"));
x.add(4);

DBObject doc = new BasicDBObject("x", x);
System.out.println(doc);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: