`
obullxl
  • 浏览: 183382 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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"}
 
十三、查询文档集合

 

 根据查询条件,我们可以通过DBCollection从数据库中取出多个对象,比如查询i>50的文档集合:
 
 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:
 
 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代表升序
 
十五、查询索引

 

 我们可以查询到所有的索引:
 
 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(String s : 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 = new BasicDBObject("name", john);
 
 // 查询所有 "name" 匹配 /joh?n/i 的文档
 DBCursor cursor = collection.find(query);

 

三、日期和时间

 

 Date now = 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 = new ArrayList<Object>();
 x.add(1);
 x.add(2);
 x.add(new BasicDBObject("foo", "bar"));
 x.add(4);
 
 DBObject doc = new BasicDBObject("x", x);
 System.out.println(doc);

 

===========================================
如有批评、指教、疑惑,请:obullxl@163.com
祝大家使用JAVA愉快!

分享到:
评论
5 楼 122829827 2012-07-03  
一个为什么一个mongo实例就是一个数据库连接池?可以配置的大小吗?
4 楼 yyf365 2011-06-27  
请教一下,第四点中提到的数据库引用有什么用处?是用来处理什么的?
3 楼 wlwolf 2010-11-10  
非常不错,学习一下
2 楼 dimpen 2010-11-08  
学习了
同时,保留了,说不定哪天用得到
1 楼 javaqiang 2010-11-05  
<div class="quote_title">好文章</div>

相关推荐

    mongoDB笔记整理

    MongoDB笔记整理 MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。下面是 MongoDB 的详细知识点: 1. 简介 MongoDB 是一个介于关系数据库和非...

    mongodb 使用手册

    这部分内容正在整理中,通常会涵盖Java驱动的安装、连接MongoDB、执行查询和操作文档的方法。 ### 第 5 章 其他 这部分可能包括监控、备份恢复、安全设置、性能优化等内容。MongoDB提供了丰富的管理工具,如`...

    JAVA核心面试知识整理【书签完整】【高清可复制】

    这份"JAVA核心面试知识整理"的资源涵盖了广泛的Java技术栈,是准备Java面试或者深化技术理解的宝贵资料。以下是对其中主要知识点的详细说明: 1. **JVM(Java虚拟机)**:JVM是Java程序运行的基础,它负责解析....

    mongodb源码学习

    对于Java开发者而言,MongoDB提供了Java驱动程序,使得在Java应用中操作MongoDB变得简单。源码分析可以揭示驱动如何建立连接、执行命令、处理结果,并提供异常处理机制。 在“ConsoleApplication1”这个文件中,很...

    Linux_64位 MongoDB集群软件及详细步骤

    MongoDB提供了Java驱动,开发者可以通过它与MongoDB进行交互,执行CRUD操作,查询、更新、删除数据。确保导入对应的MongoDB Java驱动库,如`mongodb-driver`。 9. **安全考虑** 虽然这里未提及,但在生产环境中,...

    Mybatis拦截器记录数据更新历史记录到MongoDB

    当检测到数据更新时,我们将这些信息整理成符合MongoDB文档格式的数据,并通过MongoDB的Java驱动进行插入操作。 为了使拦截器生效,我们需要在Mybatis的配置文件(通常为`mybatis-config.xml`)中注册这个拦截器。...

    把常用数据库的驱动程序放在这里,以便以后不时之需

    - **MongoDB**:MongoDB提供了Java驱动程序`mongodb-driver.jar`,用于连接和操作NoSQL数据库。 - **H2**:H2是一款轻量级、开源的Java数据库,它的JDBC驱动是`h2.jar`。 4. **使用数据库驱动**:在Java项目中,...

    mongodb增删改查详解_动力节点Java学院整理

    对于批量插入,虽然mongo shell不直接支持,但可以通过编写循环或使用语言驱动程序(如Python、Java、Go等)的批量插入功能。例如,在JavaScript中,可以使用`Array.forEach()`实现批量插入: ```javascript var ...

    mongodb安装_动力节点Java学院整理

    此外,MongoDB还支持多种开发语言的驱动,比如RUBY、PYTHON、JAVA、C++、PHP等,这也意味着开发者可以使用熟悉的编程语言来操作MongoDB数据库。 MongoDB服务端可以在Linux、Windows或OSX等操作系统上运行,支持32位...

    java核心面试知识整理(架构师).pdf

    这部分内容可能涉及Java的输入/输出模型,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动IO和异步IO模型。NIO的缓冲区、通道(Channel)、缓冲区(Buffer)、选择器(Selector)等概念也是重要的知识点。 4. JVM类...

    JAVA核心面试知识整理.rar

    这个压缩包"JAVA核心面试知识整理.rar"包含了多个关键主题,让我们逐一深入探讨。 1. **JVM(Java虚拟机)**:JVM是Java程序运行的基础,它负责解析.class文件,执行字节码,并管理内存。理解JVM的工作原理,包括类...

    爬取lian家代码+模拟网站代码.zip

    在本项目中,我们主要关注的是使用Python进行网络爬虫技术来抓取链家网站的房源数据,并结合...这涵盖了数据生命周期的多个环节,从数据采集到处理再到展示,对于理解现代数据驱动的Web应用开发具有很好的实践价值。

    steam热销游戏信息抓取,基于node.js , python , java分别实现.zip

    - Java同样可以用于网络请求,可以使用`HttpURLConnection`或第三方库如`OkHttp`。 - 对于JSON数据处理,`org.json`库可以进行解析,或者使用更先进的`Jackson`或`Gson`库。 - Java项目结构通常包含Maven或Gradle...

    学习总结desswww

    2. **反射API**:Java反射机制允许在运行时动态地获取类的信息并操作对象,是实现动态代理、元数据驱动框架(如Spring)的重要基础。 3. **设计模式**:理解并能灵活运用设计模式,如工厂模式、单例模式、观察者...

    各种常用数据库JDBC的url写法

    本资源整理了各种常用数据库的JDBC URL写法,这对于Java开发者来说是非常实用的信息,特别是对于那些频繁处理数据整合工作的人员。 1. **MySQL** MySQL是最常见的开源关系型数据库之一。它的JDBC URL格式如下: `...

    自己整理的JAVASCRIPT

    通过npm(Node Package Manager),可以安装各种模块来扩展功能,如Express.js用于构建Web服务器,MongoDB驱动用于数据库操作。 在标签`.net asp javascript jsp php`中,我们可以看到JavaScript与其他服务器端技术...

    Recomendacao-de-filmes:UFAL-阿拉戈斯联邦大学2013.2班大数据选修课项目

    其次,项目中提到了MongoDB的Java驱动程序,这是连接Java应用程序与MongoDB数据库的关键组件。MongoDB是一个流行的NoSQL数据库,适合存储非结构化数据,如JSON文档。使用Java驱动程序,开发者可以方便地执行CRUD...

    event-aggregator:整理来自事件、用户和位置服务的数据,以便在日历前端使用

    本项目"event-aggregator"显然是一个使用Java语言开发的系统,它的主要任务是整理来自事件、用户和位置服务的数据,以便在日历前端进行展示。下面我们将深入探讨这个系统的可能实现、涉及的技术和相关知识点。 1. *...

Global site tag (gtag.js) - Google Analytics