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

MongoDB的Java驱动使用整理

?该文档是翻译自文档[mongodb-docs-2010-10-24.pdf]的[Java Language Center]章节,根据自己的理解整理而成。


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

?

?MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个)。
?
?对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,我们可以用以下方式保证一致性:
?
?DB mdb = mongo.getDB('dbname');
?
?mdb.requestStart();
?//
?// 业务代码
?//
?mdb.requestDone();

?

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

?

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

?

?Java驱动提供了DBObject接口,方便我们保存对象到数据库中。
?
?定义需要保存的对象:
?
?public class Tweet implements DBObject {
??/** ...... */
?}
?
?然后我们可以使用该对象:
?
?Tweet tweet = new Tweet();
?tweet.put("user", userId);
?tweet.put("message", message);
?tweet.put("date", new Date());
?
?collection.insert(tweet);
?
?当从数据库中查询时,结果会自动的转换成DBObject对象,我们可以转换成我们自己的类型:
?
?collection.setObjectClass(Tweet);
?
?Tweet myTweet = (Tweet)collection.findOne();

?

三、创建连接

?

?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列表

?

?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中。
?
?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
?}
?
?使用一个循环插入数据:
?
?for(int i = 0; i < 100; i++) {
??coll.insert(new BasicDBObject().append("i", i));
?}
?
?我们注意到,同一个coll,我们完全可以插入不同风格的数据,这就是MongoDB的重要特性“模式自由”。
?
十、统计文档数

?

?现在我们已经有101份文档在数据库中了,现在统计一下看是否正确。
?
?long count = coll.getCount();
?System.out.println(count);
?
?控制台将会输出:101
?
十一、使用游标取得所有的文档

?

?DBCursor cursor = coll.find();
?
?while(cursor.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"}
?
十三、查询文档集合