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

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

MongoDB Java Driver 简单操作

一、Java驱动一致性

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

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

Java代码  
  1. DB mdb = mongo.getDB('dbname');
  2. mdb.requestStart();
  3. //
  4. // 业务代码
  5. //
  6. mdb.requestDone();
DB mdb = mongo.getDB('dbname'); mdb.requestStart();
//
// 业务代码
//
mdb.requestDone(); 

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

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

Java驱动提供了DBObject接口,方便我们保存对象到数据库中。

定义需要保存的对象:

public class Tweet implements DBObject {
  /** ...... */
}

然后我们可以使用该对象:

Java代码  
  1. Tweet tweet = new Tweet();
  2. tweet.put("user", userId);
  3. tweet.put("message", message);
  4. tweet.put("date", new Date());
  5. collection.insert(tweet);
Tweet tweet = new Tweet();
tweet.put("user", userId);
tweet.put("message", message);
tweet.put("date", new Date()); collection.insert(tweet); 

当从数据库中查询时,结果会自动的转换成DBObject对象,我们可以转换成我们自己的类型:

Java代码  
  1. collection.setObjectClass(Tweet);
  2. Tweet myTweet = (Tweet)collection.findOne();
collection.setObjectClass(Tweet); Tweet myTweet = (Tweet)collection.findOne(); 

三、创建连接

Java代码  
  1. Mongo m = new Mongo();
  2. Mongo m = new Mongo("localhost");
  3. Mongo m = new Mongo("localhost", 27017);
  4. DB db = m.getDB("mydb);
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列表

Java代码  
  1. Set<String> colls = db.getCollectionNames();
  2. for(String s : colls) {
  3. System.out.prinln(s);
  4. }
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中。

Java代码  
  1. DBObject doc = new BasicDBObject();
  2. doc.put("name", "MongoDB");
  3. doc.put("type", "database");
  4. doc.put("count", 1);
  5. DBObject info = new BasicDBObject();
  6. info.put("x", 203);
  7. info.put("y", 102);
  8. doc.put("info", info);
  9. coll.insert(doc);
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
}

使用一个循环插入数据:

Java代码  
  1. for(int i = 0; i < 100; i++) {
  2. coll.insert(new BasicDBObject().append("i", i));
  3. }
for(int i = 0; i < 100; i++) { coll.insert(new BasicDBObject().append("i", i));
} 

我们注意到,同一个coll,我们完全可以插入不同风格的数据,这就是MongoDB的重要特性“模式自由”。

十、统计文档数

现在我们已经有101份文档在数据库中了,现在统计一下看是否正确。

Java代码  
  1. long count = coll.getCount();
  2. System.out.println(count);
long count = coll.getCount();
System.out.println(count); 

控制台将会输出:101

十一、使用游标取得所有的文档

Java代码  
  1. DBCursor cursor = coll.find();
  2. while(cursor.hasNext()) {
  3. DBObject object = cursor.next();
  4. System.out.println(object);
  5. }
DBCursor cursor = coll.find(); while(cursor.hasNext()) { DBObject object = cursor.next(); System.out.println(object);
} 

十二、查询单个文档

Java代码  
  1. DBObject query = new BasicDBObject();
  2. query.put("i", 71);
  3. cursor = coll.find(query);
  4. while(cur.hasNext()) {
  5. DBObject object = cursor.next();
  6. System.out.println(object);
  7. }
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的文档集合:

Java代码  
  1. query = new BasicDBObject();
  2. query.put("i", new BasicDBObject("$gt", 50)); // i>50
  3. cursor = coll.find(query);
  4. while(cursor.hasNext()) {
  5. DBObject object = cursor.next();
  6. System.out.println(object);
  7. }
query = new BasicDBObject(); query.put("i", new BasicDBObject("$gt", 50)); // i>50 cursor = coll.find(query); while(cursor.hasNext()) { DBObject object = cursor.next(); System.out.println(object);
} 

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

Java代码  
  1. query = new BasicDBObject();
  2. // 20<i<=30
  3. query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));
  4. cursor = coll.find(query);
  5. while(cursor.hasNext()) {
  6. DBObject object = cursor.next();
  7. System.out.println(object);
  8. }
query = new BasicDBObject(); // 20<i<=30
query.put("i", new BasicDBObject("$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(new BasicDBObject("i", 1)); // 1代表升序

十五、查询索引

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

Java代码  
  1. List<DBObject> list = coll.getIndexInfo();
  2. for(DBObject index : list){
  3. System.out.println(index);
  4. }
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的管理功能
  
一、获取所有的数据库

Java代码  
  1. Mongo m = new Mongo();
  2. for(String s : m.getDatabaseNames()) {
  3. System.out.println(s);
  4. }
Mongo m = new Mongo(); for(String s : m.getDatabaseNames()) { System.out.println(s);
} 

二、删除数据库

m.dropDatabase("my_new_db");

MongoDB的Java类型

一、对象ID

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

Java代码  
  1. ObjectId id = new ObjectId();
  2. ObjectId copy = new ObjectId(id);
ObjectId id = new ObjectId();
ObjectId copy = new ObjectId(id); 

二、正则表达式

Java代码  
  1. Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);
  2. DBObject query = new BasicDBObject("name", john);
Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);
DBObject query = new BasicDBObject("name", john); 

// 查询所有 "name" 匹配 /joh?n/i 的文档
DBCursor cursor = collection.find(query);

三、日期和时间

Java代码  
  1. Date now = new Date();
  2. DBObject time = new BasicDBObject("ts", now);
  3. collection.save(time);
Date now = new Date();
DBObject time = new BasicDBObject("ts", now); collection.save(time); 

四、数据库引用

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

Java代码  
  1. DBRef addressRef = new DBRef(db, "foo.bar", address_id);
  2. DBObject address = addressRef.fetch();
  3. DBObject person = BasicDBObjectBuilder.start()
  4. .add("name", "Fred")
  5. .add("address", addressRef)
  6. .get();
  7. collection.save(person);
  8. DBObject fred = collection.findOne();
  9. DBRef addressObj = (DBRef)fred.get("address");
  10. addressObj.fetch();
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表示为:

Java代码  
  1. DBObject y = new BasicDBObject("y", 3);
  2. DBObject x = new BasicDBObject("x", y);
DBObject y = new BasicDBObject("y", 3);
DBObject x = new BasicDBObject("x", y); 

七、数组

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

如果想表示如下JSON数据:

Java代码  
  1. {
  2. "x": [
  3. 1,
  4. 2,
  5. {"foo": "bar"},
  6. 4
  7. ]
  8. }
{ "x": [ 1, 2, {"foo": "bar"}, 4 ]
} 

则在Java中,应该为:

Java代码  
  1. List<Object> x = new ArrayList<Object>();
  2. x.add(1);
  3. x.add(2);
  4. x.add(new BasicDBObject("foo", "bar"));
  5. x.add(4);
  6. DBObject doc = new BasicDBObject("x", x);
  7. System.out.println(doc);

Mongodb java 例子相关推荐

  1. mongodb java driver 聚合框架

    2019独角兽企业重金招聘Python工程师标准>>> Mongo 2.2.0版本介绍了mongo的聚合框架,该框架可以很方便的实现一些聚合操作,例如计数.取和.计算平均值.框架使用 ...

  2. 转载:mongoDB java驱动学习笔记

    http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...

  3. MongoDB+java+spirng+morphia

    MongoDB+java+spirng+morphia Hotle.java packagetest_yu.morphiaSpring;importcom.google.code.morphia.an ...

  4. mongodb java 开源_开源的Mongodb java client -- mango发布

    Mango  ----   一个非常简单的操作mongodb的小工具,使用java语言,基于mongodb的java driver包. 其主要的灵感来自于Jongo 项目,这是一个非常有创意的工具,将 ...

  5. MongoDB Java

    MongoDB Java 环境配置 在Java程序中如果要使用MongoDB,你需要确保已经安装了Java环境及MongoDB JDBC 驱动. 你可以参考本站的Java教程来安装Java程序.现在让 ...

  6. 程序调用飞信API发送免费短信(JAVA例子,其他语言一样用)

    网上看到有网页版的飞信,http://fetionlib.appspot.com/ 可以添加好友,群发和定时发送短信给飞信好友,还开放了API接口供程序调用,可以用它来监控机器是否正常服务定期给管理员 ...

  7. MongoDB Java API操作很全的整理以及共享分片模式下的常见操作整理

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...

  8. [MongoDB] Java异步操作Mongo示例

    [MongoDB] Java异步操作Mongo示例 一.问题描述 二.版本说明 1.数据库 2.JDK版本 3.依赖 三.相关代码 1.ObservableSubscriber.java和Consum ...

  9. mongodb java驱动_Java的MongoDB驱动及读写策略

    网上看见一篇博文,详细讲了MongoDB读写策略,将来生产会遇到类似的问题,转来备查. 指定新mongo实例: Mongo m = new Mongo(); Mongo m = new Mongo( ...

最新文章

  1. 【Android源码剖析】(API 19)[View-----MeasureSpec]
  2. Python easyGUI 文件浏览 显示文件内容
  3. linux进程--exec详解(四)
  4. libsvm 64 系统下编译问题
  5. flutter获取Android照片地址,Flutter项目安卓配置启动图片
  6. 如何利用期限来完成任务
  7. Spring mvc 异常处理
  8. 时间定位表达式-用于时间的加、减调整
  9. java中的object... args参数
  10. 51单片机c语言编写计算器仿真,51单片机实现计算器 proteus仿真及其程序源码 带教程...
  11. 对象流的序列化和反序列化
  12. WDM驱动开发 电源管理
  13. mina mysql_SpringBoot集成Socket通讯之Mina框架
  14. 一台电脑中,如何使 git 同时配置Github、Gitee等多种版本控制工具
  15. 激进投资者卡尔·伊坎辞去雅虎董事职务(每日关注,10月24日)
  16. 利用Zeplin从设计图自动生成CSS,提高前端样式开发效率
  17. c atol()函数_atol()函数以及C ++中的示例
  18. java 什么意思_Java中的“ ”是什么意思?
  19. 获取当前系统时间(三种方法)
  20. jQuery选择器(二)

热门文章

  1. python豆瓣mysql_python操作mysql
  2. 操作系统之文件管理:8、文件系统实例
  3. Linux日常运维管理技巧(二)Linux防火墙:你可以ping别人,别人ping不了你、转发、代理
  4. JS 字符串常用函数
  5. TCP/IP四层模型及各层协议首部详述(包含IOS7层)
  6. C/C++面试题—重建二叉树【前序 + 中序- 重建二叉树 和 后序 + 中序 - 重建二叉树】
  7. MyBatis3系列__05查询补充resultMap与resultType区别
  8. SQL Server类型与C#类型对应关系
  9. JavaScript代码规范和性能整理
  10. Git 忽略已经提交的文件