【引言】

毕竟现在MongoDB还是出于成长阶段,所以现在网上相关的资料很少,而且大部分还都是针对于MongoDB的老版本的。再加上MongoDB的频繁升级、重大更新等等,导致菜鸟学习的难度增大。

好了,前几篇讲的都是MongoDB数据库相关的知识,最终,还是要与java来接轨(当然,卤煮是搞java开发的)。看了看现在的java驱动版本截至目前2016年8月27日为止为3.3,与网上搜索到的教程很多写法不一致,所以卤煮在此决定研究一下官网的教程,希望能对自己或者其他人有一点帮助,足矣...

ps:本文只是官网的一个快速入门,让我这样的菜鸟能了解个大概,有些地方可能还需要深入的学习才能读懂。本人水平有限,有些地方有删减,翻译不到位的地方还请各位看官海涵并留言指出,本人一定虚心学习改正,以免误导!

O shit!突然想起来,MongoDB的java驱动也不好找,忘了给大家提供干货了,特地快马加鞭的补上:mongo-java-driver-3.3.0.jar下载

【翻译篇】

官网原文地址:戳这里

MongoDB驱动程序快速入门

以下的所有示例代码来自QuickTour.java文件,可以在驱动程序源代码中找到。
 
 

1.创建一个连接

下面的例子展示了通过5种方式来连接本地的数据库 mydb,如果数据库不存在,MongoDB会自动创建。
  1. // 简单直接的连接数据库,默认为本机地址localhost,端口号27017
  2. MongoClient mongoClient = new MongoClient();
  3. // 或者像这样指定连接地址
  4. MongoClient mongoClient = new MongoClient( "localhost" );
  5. // 或者像这样指定连接地址和端口号
  6. MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
  7. // 或者像这样连接到一个副本集,需要提供一个列表
  8. MongoClient mongoClient = new MongoClient(
  9. Arrays.asList(new ServerAddress("localhost", 27017),
  10. new ServerAddress("localhost", 27018),
  11. new ServerAddress("localhost", 27019)));
  12. // 或者使用连接字符串
  13. MongoClientURI connectionString = new MongoClientURI("mongodb://localhost:27017,localhost:27018,localhost:27019");
  14. MongoClient mongoClient = new MongoClient(connectionString);
  15. // 获取到数据库对象mydb,如果不存在则自动创建
  16. MongoDatabase database = mongoClient.getDatabase("mydb");
MongoClient
一个MongoClient实例实际上表示的是一个数据库连接池,即使是多线程,你也只需要一个MongoClient类的实例。
注意

通常,对于一个数据库集群你仅仅只需要创建一个MongoClient实例,并且使用它来贯穿你的整个应用程序。当创建多个实例的时候:

  • 注意每个MongoClient实例的所有资源使用限制(最大连接数等等)
  • 销毁实例,请确保你调用MongoClient.close() 来清理资源

2.获取一个集合

要获取一个集合来进行更多操作,需要为getCollection()方法指定一个集合的名称。
下面的例子表示获取名称为 test 的集合:
  1. MongoCollection<Document> collection = database.getCollection("test");

3.插入一个文档

一旦你有了Collection集合对象了,你可以往集合中插入一个文档。例如,观察下面的JSON文档,这个文档中又包含了一个嵌入式的文档字段 info
  1. {
  2. "name" : "MongoDB",
  3. "type" : "database",
  4. "count" : 1,
  5. "info" : {
  6. x : 203,
  7. y : 102
  8. }
  9. }
使用java驱动程序中的Document类来创建文档,你同样也可以使用这个类来创建嵌入式的文档。
  1. Document doc = new Document("name", "MongoDB")
  2. .append("type", "database")
  3. .append("count", 1)
  4. .append("info", new Document("x", 203).append("y", 102));
使用insertOne()方法来向集合中插入文档
  1. collection.insertOne(doc);

4.插入多个文档

你可以使用insertMany()方法来插入多个文档。

下面的例子将会创建多个文档:
  1. { "i" : value }

在一个循环中创建文档:

  1. List<Document> documents = new ArrayList<Document>();
  2. for (int i = 0; i < 100; i++) {
  3. documents.add(new Document("i", i));
  4. }

把这些文档插入到集合中,把这个文档列表传递给insertMany()方法:

  1. collection.insertMany(documents);

5.统计集合中的文档数量

到现在为止我们已经插入了101个文档(我们在循环中创建了100个,加上第一个文档),我们可以使用count()方法来检查一下它们是否都已经插入成功了。下面的代码应该输出101:
  1. System.out.println(collection.count());

6.查询集合

使用find()方法来查询集合。

6.1查询集合中的第一个文档

要获取集合中的第一个文档,需要在find()方法操作后调用first()方法,collection.find().first() 返回第一个文档或者空,而不是一个游标。这对于只需要匹配单个文档或者你只需要第一个文档的查询很有用处。
下面的例子会打印出从集合中找到的第一个文档:
  1. Document myDoc = collection.find().first();
  2. System.out.println(myDoc.toJson());

这个例子将会输出以下内容:

  1. { "_id" : { "$oid" : "551582c558c7b4fbacf16735" },
  2. "name" : "MongoDB", "type" : "database", "count" : 1,
  3. "info" : { "x" : 203, "y" : 102 } }
注意

_id字段是由MongoDB自动添加到文档中的,从而与其他的文档进行区分展示。MongoDB保留所有以“_”、“$”为开始的字段名,以供内部使用。

6.2查询集合中的所有文档

要检索集合中的所有文档,需要使用find()方法。该方法返回了一个提供灵活接口的FindIterable实例来控制查询操作。使用iterator()方法可以得到一个匹配查询条件的文档集迭代器。下面的代码检索了集合中的所有文档,并且把它们输出来(101个文档)

  1. MongoCursor<Document> cursor = collection.find().iterator();
  2. try {
  3. while (cursor.hasNext()) {
  4. System.out.println(cursor.next().toJson());
  5. }
  6. } finally {
  7. cursor.close();
  8. }

虽然下面的语句是允许的,但是不鼓励使用,因为如果循环提前终止的话可能会遗漏一个游标。

  1. for (Document cur : collection.find()) {
  2. System.out.println(cur.toJson());
  3. }

7.使用查询过滤器得到一个单一的文档

我们可以创建一个过滤器并传递给find()方法,来得到集合中文档的子集。例如,我们想要查询字段“i”的值为71的文档,我们可以这样做:
  1. import static com.mongodb.client.model.Filters.*;
  2. myDoc = collection.find(eq("i", 71)).first();
  3. System.out.println(myDoc.toJson());
然后它就会仅仅输出一个文档:
  1. { "_id" : { "$oid" : "5515836e58c7b4fbc756320b" }, "i" : 71 }
注意

可以使用 FiltersSortsProjections 和Updates类来创建简单明了的查询方式。

8.查询一组文档

我们可以使用查询来获得集合中的一组文档。例如,如果我们想得到 i>50 的文档,我们可以这样写:
  1. // 现在使用范围查询来得到一个大点的子集
  2. Block<Document> printBlock = new Block<Document>() {
  3. @Override
  4. public void apply(final Document document) {
  5. System.out.println(document.toJson());
  6. }
  7. };
  8. collection.find(gt("i", 50)).forEach(printBlock);

请注意,在这里我们在FindIterable 上面使用了forEach()方法,并且打印出了所有 i>50的文档。

我们还可以得到一个范围,比如说,50<i<=100:
  1. collection.find(and(gt("i", 50), lte("i", 100))).forEach(printBlock);

9.排序

我们也可以使用Sorts帮助类来进行排序文档。我们通过在FindIterable 上调用sort()方法来添加一个排序查询,下面我们使用exists()方法和descending("i")方法来排序:
  1. myDoc = collection.find(exists("i")).sort(descending("i")).first();
  2. System.out.println(myDoc.toJson());

exists():查询含有指定字段的文档

descending():按照某一字段进行desc降序排序,同理还有ascending()方法

10.字段投影

有时候我们并不需要文档中的所有数据,Projections帮助类可以帮助我们在查询操作中创建投影参数。下面我们将进行整理,通过使用Projections.execludeId()方法来排除文档中的“_id”字段,并且输出第一个匹配的文档:
  1. myDoc = collection.find().projection(excludeId()).first();
  2. System.out.println(myDoc.toJson());

11.聚合

有时候,我们需要聚合存储在MongoDB中的数据,Aggregates 帮助类为每种类型的聚合提供了构建。
下面我们将通过一个简单的两步骤转换,来计算 i*10的值。首先我们使用Aggregates.match()方法来查询所有i>0的文档,然后我们使用Agreegates.project()方法重塑文档,再结合$multiply操作来计算“ITimes10”的值:
  1. collection.aggregate(asList(
  2. match(gt("i", 0)),
  3. project(Document.parse("{ITimes10: {$multiply: ['$i', 10]}}")))
  4. ).forEach(printBlock);

12.更新文档

使用updateOne()方法来更新0个或1个文档(如果没有和过滤器匹配的话则是0个),并且要指定过滤器和更新后的文档。这里我们使用Updates.set()方法来更新符合i=10的第一个文档,并且设置i的值为110:
  1. collection.updateOne(eq("i", 10), set("i", 110));

要更新所有匹配过滤器的文档,需要使用updateMany()方法。这里我们使用Updates.inc()方法来对i<100的文档进行增加100(即i+100):

  1. UpdateResult updateResult = collection.updateMany(lt("i", 100), inc("i", 100));
  2. System.out.println(updateResult.getModifiedCount());

更新方法返回一个UpdateResult对象,该对象提供了包括更新文档的数量等信息。

 

13.删除文档

使用deleteOne()方法来删除0个或1个文档
  1. <span style="font-size:18px;">collection.deleteOne(eq("i", 110));</span>

使用deleteMany()方法来删除匹配过滤的所有文档。

这里我们删除i>=100的所有文档:

  1. DeleteResult deleteResult = collection.deleteMany(gte("i", 100));
  2. System.out.println(deleteResult.getDeletedCount());

删除方法返回一个DeleteResult对象,该对象中提供了包括删除文档数量等信息。

 

14.批量操作

这些新命令允许批量插入/更新/删除操作的执行,这里有两种批量操作的方式(不知道理解的对不对):
  1. 有序批量操作。

    执行所有预定操作,当出现写入错误时会停止操作。

  2. 无序批量操作。

    执行所有操作,并报告所有的错误。

    无序批量操作不保证所有操作的执行。

我们来看下两个简单的例子:
  1. // 2. 有序批量操作,调用是有保证的
  2. collection.bulkWrite(
  3. Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
  4. new InsertOneModel<>(new Document("_id", 5)),
  5. new InsertOneModel<>(new Document("_id", 6)),
  6. new UpdateOneModel<>(new Document("_id", 1),
  7. new Document("$set", new Document("x", 2))),
  8. new DeleteOneModel<>(new Document("_id", 2)),
  9. new ReplaceOneModel<>(new Document("_id", 3),
  10. new Document("_id", 3).append("x", 4))));
  11. // 2. 无序批量操作,调用没有保证
  12. collection.bulkWrite(
  13. Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
  14. new InsertOneModel<>(new Document("_id", 5)),
  15. new InsertOneModel<>(new Document("_id", 6)),
  16. new UpdateOneModel<>(new Document("_id", 1),
  17. new Document("$set", new Document("x", 2))),
  18. new DeleteOneModel<>(new Document("_id", 2)),
  19. new ReplaceOneModel<>(new Document("_id", 3),
  20. new Document("_id", 3).append("x", 4))),
  21. new BulkWriteOptions().ordered(false));
重要

当MongoDB的服务器版本为2.6以下时,不推荐使用bulkWrite方法,因为这是第一个支持批量插入、更新、删除命令的服务器版本,在某种程度上,可以让驱动程序实现BulkWriteResult和BulkWriteException的正确的语义。该方法仍然会在2.6以下版本的服务器工作,但性能将受到影响,因为每个写操作将会被单独执行一次。

MongoDB学习(五)使用Java驱动程序3.3操作MongoDB快速入门的更多相关文章

  1. mongodb学习(3)--- NodeJs使用mongoose操作mongodb

    转载: https://cnodejs.org/topic/50c145ed637ffa4155c7eaee 首先对于以下错误说明(有写 db.close): Error: db object alr ...

  2. MongoDB学习笔记(2):数据库操作及CURD初步

    MongoDB学习笔记(2):数据库操作及CURD 数据库操作 创建数据库 首先MongoDB中数据库的创建和数据库的切换都是使用命令,USE DATABASE,如果要切换的数据库不存在则会进行创建, ...

  3. 【MongoDB详细使用教程】四、python操作MongoDB

    目录 1.安装pymongo 2.连接数据库 3.操作数据库 3.1.查 3.2.增 3.3.改 3.4.删 使用第三方库pymongo来实现python对MongoDB的操作 pymongo官方文档 ...

  4. Java 图片处理解决方案:ImageMagick 快速入门

    一.ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件,可以实现图片切割.颜色替换.图片缩略图.图片水印等各种效果.ImageMagick是免费开源软件,支持大多 ...

  5. Java 图片处理解决方案:ImageMagick 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文Java 图片处理解决方案:ImageMagick 快速入门教程. ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件 ...

  6. MongoDB的安装配置、基本操作及Perl操作MongoDB

    MongoDB的安装配置.基本操作及Perl操作MongoDB http://www.myhack58.com/Article/60/63/2014/42353.htm

  7. [转载]MongoDB学习 (五):查询操作符(Query Operators).1st

    本文地址:http://www.cnblogs.com/egger/archive/2013/05/04/3059374.html   欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 查询操作符(Quer ...

  8. Java学习笔记十:Java的数组以及操作数组

    Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学生的成绩 数组中的元 ...

  9. MongoDB学习笔记(一)——Windows 下安装MongoDB

     首先从官网下载mongodb的windows安装包,根据自己系统类型选择32位或者64位版本安装即可,然后根据提示一路下一步即可安装完成.如果没有修改安装目录会默认安装在C:\Program Fil ...

随机推荐

  1. 约会安排---hdu4553(线段树,麻烦的区间覆盖)

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意, ...

  2. formset批量处理form表单数据

    Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据 class StudentStudyRecordModel( ...

  3. Day23 ajax

    AJAX AJAX概述 1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML".即使用Ja ...

  4. Day05 xml详解

    day05总结 今日内容 XML语法 XML约束之DTD XML解析器介绍 XML解析之JAXP( DOM.SAX ) DOM4J Schema   一.XML语法 XML概述   1 什么是XML ...

  5. Spark UI (基于Yarn) 分析与定制

    转载自:https://yq.aliyun.com/articles/60194 摘要: 这篇文章的主旨在于让你了解Spark UI体系,并且能够让你有能力对UI进行一些定制化增强.在分析过程中,你也 ...

  6. python16_day34【设计模式】

    一.简单工厂模式 # coding : utf-8 # create by ztypl on 2017/5/24 from abc import abstractmethod, ABCMeta cla ...

  7. 自定义centos7 yum仓库

    将安装光盘插入 mkdir /newyum umount /dev/sr0 mount /dev/sr0 /media cp -rf /media/Packages /newyum #将镜像中的rpm ...

  8. placement new--《C++必知必会》 条款35

    placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本 ...

  9. SQL面试题及答案

    我觉得里面有些答案是不正确的,请只作参考 Student(S#,Sname,Sage,Ssex) 学生表       S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Cour ...

  10. linux在线安装telnet

    平常在调试机器网络互通的时候使用到telnet,新机器一般没安装相应命令,需要我们手工安装. 下面是在线安装的方法,使用以下命令即可完成安装: yum install telnet