日期:2014-05-16  浏览次数:20487 次

MongoDB 的Java编程例子(转贴)
原文:http://www.kafka0102.com/2010/07/209.html



1、连接数据库
和mongodb建立连接的示例代码如下:
Mongo m = new Mongo("localhost",27017);
	DB db = m.getDB("db_test");



尽管这里获得了表示mongodb的db_test数据库连接的对象db,但这时并没有真正和mongodb建立连接,所以即便这时数据库没起来也不会抛
出异常,尽管你还是需要catch它的实例化过程。mongodb的java
driver对连接做了池化处理,所以应用中只需要实例化一个Mongo对象即可,对它的操作是线程安全的,这对开发使用来说真的是很方便。

2、取得DBCollection
mongodb中的collection在Java中使用DBCollection表示(这是一个抽象类,尽管你不必需要知道),创建DBCollection实例也是一行代码,和创建DB实例一样,这个操作并不涉及真正的和数据库之间的通信。


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


要获得类似mysql中“show tables”功能,可以使用如下代码:

        Set<String> colls = db.getCollectionNames();
	for (String s : colls) {
	    System.out.println(s);
	}

3、插入文档
mongodb存储JSON格式的文档,而在Java中表示这种数据格式的最简便的类就是Map了。MongoDB Java
Driver中提供的BasicDBObject就是个Map(它继承自LinkedHashMap并实现DBObject接口),它会将Map中的数据
转换成BSON格式传输到mongodb。下面是插入文档的示例:

        DBCollection coll = db.getCollection("collection1");
	BasicDBObject doc = new BasicDBObject();
	doc.put("name", "kafka0102");
	doc.put("age", 28);
	doc.put("time", new Date());
	coll.insert(doc);


mongodb中每个插入的文档会产生个唯一标识_id。当调用coll.insert(doc);时,driver会检查其中是否有_id字段,如果没
有则自动生成ObjectId实例来作为_id的值,这个ObjectId由4部分编码而成:当前时间、机器标识、进程号和自增的整数。

insert函数也支持插入文档列表:
insert(List<DBObject> list)


而提交操作也有update( DBObject q , DBObject o )、remove( DBObject o )。

4、查询文档
4.1、findOne
findOne是查询满足条件的第一条记录(不意味着数据库满足条件的只有一条记录),查询条件使用DBObject表示,示例如下:
        DBCollection coll = db.getCollection("collection1");
	BasicDBObject cond = new BasicDBObject();
	cond.put("name", "kafka0102");
	cond.put("age", 28);
	DBObject ret = coll.findOne(cond);
	System.out.println(ret);


返回结果是个DBObject,可以通过get(key)来取值。对于查询条件,可以通过嵌套多层来表示复杂的格式,比如:
        query = new BasicDBObject();
        query.put("i", new BasicDBObject("$gt", 50));  // e.g. find all where i > 50


4.2、find
find函数是查询集合的,它返回的DBCursor是DBObject的迭代器,使用示例如下:
	DBCollection coll = db.getCollection("collection1");
	BasicDBObject cond = new BasicDBObject();
	cond.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));
	DBCursor ret = coll.find(cond);
	while(ret.hasNext()) {
	   System.out.println(ret.next());
	}


5、使用索引
创建索引语句如:coll.createIndex(new BasicDBObject(“i”, 1));
,其中i表示要索引的字段,1表示升序(-1表示降序)。可以看到,DBObject成为java客户端通用的结构表示。查看索引使用
DBCollection.getIndexInfo()函数。

6、MongoDB Java Driver的并发性
前面提到,Java MongoDB
Driver使用了连接的池化处理,这个连接池默认是保持10个连接,可以通过Option进行修改,在应用中使用Mongo的一个实例即可。连接池中的
每个连接使用DBPort结构表示(而不是DBCollection),并寄存于DBPortPool中,所以对DBCollection的操作并不意味
着使用同一个连接。如果在应用的一次请求过程中,需要保证使用同一个连接,可以使用下面的代码片断:


        DB db...;
	db.requestStart();
	//code....
	db.requestDone();



在requestStart和requestDone之间使用的连接就不是来自于DBPortPool,而是当前线程中的ThreadLocal结构变量(MyPort中保持了DBPort成员)。