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成员)。