MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好。

MongoDB在今年做了一次重大升级,版本来到了3.0。

相比之前的版本,这个版本中又很大的变化,相应地,本文中的方法可能在旧的版本中无法使用。

安装MongoDB Java Driver

使用maven的用户在pom.xml中使用以下的dependency。

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.1.0-SNAPSHOT</version>
</dependency>

建立连接

程序可以通过MongoClient这个类和MongoDB数据库建立连接。


MongoClient mongoClient = new MongoClient(); // or
MongoClient mongoClient = new MongoClient( "localhost" ); // or
MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // or, 连接副本集,MongoClient会自动识别出
MongoClient mongoClient = new MongoClient(
Arrays.asList(new ServerAddress("localhost", 27017),
new ServerAddress("localhost", 27018),
new ServerAddress("localhost", 27019))); MongoDatabase database = mongoClient.getDatabase("mydb");

如果mydb不存在的话,那么Mongo也会给我们新创建一个数据库。

MongoDatabase的本质就是一个数据库的连接,而MongoClient是一个Client,所以我们在应用中可能需要多个连接,却只需要创建一个MongoClient就可以了,MongoClient本身封装了一个连接池。关于MongoClient,后面再补一篇文章。

获得集合

在得到连接之后,通过getCollection()方法来获取,相同地,如果获取的集合不存在,那么Mongo会为我们创建这个集合。

MongoCollection<Document> collection = database.getCollection("users");

插入一个文档

在MongoDB中,数据都是以文档的形式存在的,一个集合可以理解成一个“文档链”。

在获得集合之后,程序就可以通过集合来插入一个新的数据了。

在Mongo Java API中,文档对应的类是Document , 文档中间还可以内嵌文档。

比如插入这样的数据

{
"username" : "whthomas",
"age" : "22",
"location":{
"city" : "hangzhou",
"x" : 100,
"y" : 200
}
}
Document doc = new Document("username","whthomas").append("age", "22").append("location", new Document("city", "hangzhou").append("x", 100).append("y","200"));

collection.insertOne(doc);

如果要插入多个文档。使用insertMany()函数效率会更高一些,这个函数接受一个List< Document >类型。

List<Document> documents = new ArrayList<Document>();
for (int i = 0; i < 100; i++) {
documents.add(new Document("i", i));
} collection.insertMany(documents);

查询操作

查询操作数据库操作中相对比较复杂的操作,在MongoDB中通过集合的find()方法来查询数据。

find()函数会返回FindIterable,它提供了一个接口给程序操作和控制这个集合。

得到第一条数据

使用first()函数可以得到结果集中的第一条数据,如果没有找到数据,则返回一个null值。

Document myDoc = collection.find().first();

得到所有数据

通过iterator方法将FindIterable对象转换成一个MongoCursor对象。

MongoCursor<Document> cursor = collection.find().iterator();
try {
while (cursor.hasNext()) {
System.out.println(cursor.next().toJson());
}
} finally {
cursor.close();
}

条件查询

MongoDB的Java条件查询操作,在我看来有些不那么面向对象,写起来有点函数式编程的味道。

通过Filters、Sorts和Projections三个类,我们可以完成复杂的查询操作。

比如程序需要得到一个指定条件的数据

import static com.mongodb.client.model.Filters.*;

Document myDoc = collection.find(eq("i", 71)).first();

往find函数中“传递”一个eq函数,得到i为71的数据。

过滤条件函数

条件 函数 例子
等于 eq() eq("i",50)
大于 gt() gt("i",50)
小于 lt() lt("i",50)
大于等于(>=) gte() gte("i",50)
小于等于(<=) lte() lte("i",50)
存在 exists() exists("i")

排序操作

对FindIterable对象使用sort函数进行排序。ascending函数表示升序,descending函数表示降序。

collection.find().sort(orderBy(ascending("x", "y"), descending("z")))

过滤字段

有时候,我们并不需要一条数据中所有的内容,只是需要一部分而已,mongoDB 提供了一个projection方法,解决了这个问题。

collection.find().projection(fields(include("x", "y"), excludeId()))

使用forEach

有时候对不同的集合会有相同的操作,做通用方法是最佳实践,Mongo对于函数式的编程范式真是充满了热情,为我们提供了大量非常“函数式”的方法(在Java这种完全面向对象的语言里,做到这样真是不容易)。

我们可以通过forEach函数和Block类完成对集合中每个节点数据的操作。

Block<Document> printBlock = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
};
collection.find(gt("i", 50)).forEach(printBlock);

更新数据

使用updateOne()函数,更新一条数据,第一个参数选取需要被更新的记录,第二个参数设置需要被更新的具体数据

collection.updateOne(eq("i", 10), new Document("$set", new Document("i", 110)));

如果需要更新多条数据,可以使用updateMany函数,这个函数会返回一个UpdateResult类的对象,这个对象里面保存了数据更新的结果。

UpdateResult updateResult = collection.updateMany(lt("i", 100),
new Document("$inc", new Document("i", 100)));

删除数据

通过集合使用deleteOne()方法来删除指定的数据,如果想要删除多条数据,使用deleteMany方法来完成操作.

collection.deleteOne(eq("i", 110));

DeleteResult deleteResult = collection.deleteMany(gte("i", 100));

Bulk操作

MongoDB提供了一种称为Bulk的操作方式,数据不会被立即被持久化到数据库中,而是等待程序调度,确定合适的时间持久化到数据库中。

Bulk操作支持有序操作,和无序操作两种模式。有序操作中数据的的操作,会按照顺序操作,一旦发生错误,操作就会终止;而无序操作,则不安顺序执行,只会报告哪些操作发生了错误。

Bulk操作支持增删改三种操作,对应的model分别是InsertOneModel、UpdateOneModel、DeleteOneModel、ReplaceOneModel。它们都继承于WriteModel

// 有序操作
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4)))); // 无序操作
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4))),
new BulkWriteOptions().ordered(false));

MongoDB Java Driver操作指南的更多相关文章

  1. Mongodb Java Driver 参数配置解析

    要正确使用Mongodb Java Driver,MongoClientOptions参数配置对数据库访问的并发性能影响极大. connectionsPerHost:与目标数据库能够建立的最大conn ...

  2. MongoDB Java Driver

    本文使用 Java 来描述对 Mongodb 的相关操作,数据库版本是 3.2.8,驱动版本为 3.2.2. 本文将讨论 如何连接MongoDB 文档的 CURD 操作 文档的上传和下载 1. 连接到 ...

  3. MongoDB Java Driver 3.4操作

    导入jar包 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-dr ...

  4. BuguMongo是一个MongoDB Java开发框架,集成了DAO、Query、Lucene、GridFS等功能

    http://code.google.com/p/bugumongo/ 简介 BuguMongo是一个MongoDB Java开发框架,它的主要功能包括: 基于注解的对象-文档映射(Object-Do ...

  5. 数据库.MongoDB.Java样例

    1.先在MongoDB官网下载Java驱动包 MongoDB Java Driver: http://mongodb.github.io/mongo-java-driver/ JAR包下载列表 htt ...

  6. 给java mongodb 官方driver 增加bean 操作

      mongodb官方的java driver不支持直接插入java bean,只能使用DbObject的Key,Value形式进行insert,update,(c# mongodb官方driver类 ...

  7. Date, TimeZone, MongoDB, java中date的时区问题

    打印new Date(),Fri Aug 12 13:37:51 CST 2016. 显示Asia/Shanghai的时区,但是date toString 的时区简写却是CST.更坑爹的是,Googl ...

  8. [译] MongoDB Java异步驱动快速指南

    导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...

  9. MongoDB C Driver使用教程

    MongoDB C Driver使用教程 转载请注明出处http://www.cnblogs.com/oloroso/ 本指南提供简介 MongoDB C 驱动程序. 在 C API 的详细信息,请参 ...

随机推荐

  1. JS核心系列:浅谈 call apply 与 bind

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  2. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  3. Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

    Jexus 是一款运行于 Linux 平台,以支持  ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...

  4. ASP.NET路由模型解析

    大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...

  5. json与JavaScript对象互换

    1,json字符串转化为JavaScript对象: 方法:JSON.parse(string) eg:var account = '{"name":"jaytan&quo ...

  6. HTML5 progress和meter控件

    在HTML5中,新增了progress和meter控件.progress控件为进度条控件,可表示任务的进度,如Windows系统中软件的安装.文件的复制等场景的进度.meter控件为计量条控件,表示某 ...

  7. HttpUrlConnection 基础使用

    From https://developer.android.com/reference/java/net/HttpURLConnection.html HttpUrlConnection: A UR ...

  8. mysql 学习总结

    MYSQL的增.删.查.改   注册.授权 #创建一个对数据库中的表有一些操作权限的用户,其中OPERATION可以用all privileges替换,DBNAME.TABLENAME可以用*替换,表 ...

  9. 【Reading Note】算法读书杂记

    1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...

  10. MyBatis基础入门--知识点总结

    对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...