MongoDB Java API

本文详细介绍了MongoDB Java API的基本操作,包括线程安全、保存与查找对象、创建连接、认证、获取Collection列表、插入文档、查询文档、创建索引等功能。此外,还涉及了MongoDB的Java类型如ObjectId、正则表达式、日期和时间、数据库引用、二进制数据、内嵌文档和数组等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB Java API

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

 

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

 

MongoDBJava Driver 简单操作

 

一、Java驱动一致性

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

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

 

 DBmdb = 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);

 DBdb = 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中。

 DBObjectdoc = 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份文档在数据库中了,现在统计一下看是否正确。

 longcount = 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"}

 

十三、查询文档集合

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

 

 query = new BasicDBObject();

 

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

 

 cursor = coll.find(query);

 

 while(cursor.hasNext()) {

 DBObject object = cursor.next();

 System.out.println(object);

 }

 

 比如查询条件为20<i<=30:

 

 query = new BasicDBObject();

 

 //20<i<=30

 query.put("i", newBasicDBObject("$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(newBasicDBObject("i", 1)); // 1代表升序

 

十五、查询索引

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

 

 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的管理功能

  

一、获取所有的数据库

Mongo m = new Mongo();

 

 for(Strings : m.getDatabaseNames()) {

 System.out.println(s);

 }

二、删除数据库

m.dropDatabase("my_new_db");

 

MongoDB的Java类型

一、对象ID

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

 

 ObjectId id = new ObjectId();

 ObjectId copy = new ObjectId(id);

 

二、正则表达式

Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);

 DBObject query = newBasicDBObject("name", john);

 

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

 DBCursor cursor = collection.find(query);

 

三、日期和时间

 Datenow = new Date();

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

 collection.save(time);

 

四、数据库引用

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

 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表示为:

 

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

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

 

七、数组

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

 如果想表示如下JSON数据:

 

 {

 "x": [

   1,

   2,

  {"foo": "bar"},

   4

  ]

 }

 

 则在Java中,应该为:

 

 List<Object> x = newArrayList<Object>();

 x.add(1);

 x.add(2);

 x.add(new BasicDBObject("foo","bar"));

 x.add(4);

 

 DBObject doc = newBasicDBObject("x", x);

 System.out.println(doc);

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黑师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值