java对mongodb进行操作

参考资料

1、http://www.mongodb.org/display/DOCS/Java+Tutorial
2、http://api.mongodb.org/java/current/index.html

 

本周实验性地使用上mongodb,应用场景很简单,所以现在对mongodb了解也不是很深入。本文主要介绍mongodb的java客户端编程,这方面的内容也很简单,这里只是做个总结。不得不说,像mongodb这种介于kv和sql之间的存储,对很多的互联网应用很合适。mongodb现在的应用案例已经很多,并且社区的活跃度很高(国内也有不少人对其有很深的研究,如果有时间和精力,或许我也会投入一些对mongodb的研究),很值得期待。

言归正传,下面总结下使用Java开发mongodb应用的一些点滴。在Java中和mongodb交互的最直接的选择就是使用MongoDB Java Driver,其下载地址是:http://github.com/mongodb/mongo-java-driver/downloads。总的来说,在Java中操作mongodb的API还是很简洁,下面对其一些常见的使用做些介绍。

1、连接数据库

和mongodb建立连接的示例代码如下:

 

    Mongo m  = new Mongo("localhost",27017);
    DB db = m.getDB("qimiguangdb");


尽管这里获得了表示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", "qimiguang"); doc.put("age", 22); 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 )。

想要添加内嵌文档,如“z”:{“hello”:“world”},就得先创建另外一个BasicDBObject对象,然后将其放入到上一级:

                  BasicDBObject z = new BasicDBOject();

                  z.put("hello","world");

                  doc.put("z",z);

这样就有了{"name":"qimiguang","age":22,"time":~~~,"z":{"hello":"world}}文档

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

7、其他选择

尽管Java mongodb driver很不错,但就像很多人不使用JDBC而使用一些ORM框架,mongodb的java客户端也有其他的选择。
1)对POJO和DAO的支持。对于那些热衷ORM的人来说,Morphia(http://code.google.com/p/morphia/wiki/QuickStart)是个不错的选择,它通过在POJO中添加注释来实现映射,并提供对DAO的CRUD操作的支持。
2)对DSL的支持。Sculptor就是这样的东西,使用者编写中立的DSL文件,Sculptor将其翻译成代码。这通常不具有吸引力,除非是多语言的应用,能将DSL翻译成多种编程语言,否则除了增加学习成本,没什么收益。
3)对JDBC的支持。mongo-jdbc是这样的东西,但现在还是实验性质的。它或许是想亲近Java程序员,不过它显然不能完全兼容JDBC,而很多Java程序员对JDBC也并不感冒,所以它不是很值得使用。

 

文章来源:http://www.kafka0102.com/2010/07/209.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值