目录
本文导读
1、相比 Java 操作 关系型数据库(如 Mysql) 而言,Java 操作 noSql 更加简单,因为没有事务这些操作。
2、Java 操作 Mysql 数据库需要 Mysql 的连接驱动包,同理 Java 操作 MongoDB 也需要连接驱动包,叫 mongo-java-driver !
3、本文环境:Java JDK 1.8、MongoDB 4.0.2、Mongo-Java-Driver-3.8.1.jar。
准备依赖
1、新建工程,并导入依赖。
MongoDB 官网:https://www.mongodb.com/
MongoDB-Java-Driver 项目官方 GitHub 托管地址:https://github.com/mongodb/mongo-java-driver
MongoDB-Java-Driver 文档、API、Maven依赖,Jar 包获取地址:https://mongodb.github.io/mongo-java-driver/
<!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>3.8.1</version>
</dependency>
启动 MongoDB 数据库
1、如下所示,使用免安全认证运行 MongoDB 服务器,使用默认端口 27017,MongoDB 版本为 4.0.2。
C:\Users\Administrator.SC-201707281232>mongod --dbpath=D:\MongoDB\Data
2018-09-15T15:00:14.055+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2018-09-15T15:00:14.424+0800 I CONTROL [initandlisten] MongoDB starting : pid=10980 port=27017 dbpath=D:\MongoDB\Data 64-bit host=SC-201707281232
2018-09-15T15:00:14.424+0800 I CONTROL [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] db version v4.0.2-rc0
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] git version: fc1573ba18aee42f97a3bb13b67af7d837826b47
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] allocator: tcmalloc
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] modules: none
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] build environment:
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] distmod: 2008plus-ssl
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] distarch: x86_64
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] target_arch: x86_64
2018-09-15T15:00:14.425+0800 I CONTROL [initandlisten] options: { storage: { dbPath: "D:\MongoDB\Data" } }
2018-09-15T15:00:14.492+0800 I STORAGE [initandlisten] Detected data files in D:\MongoDB\Data created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2018-09-15T15:00:14.492+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=3552M,session_max=200
.............
CRUD 数据库
1、数据库操作包括:MongoDB 服务端连接,查询数据库、删除数据库,创建数据库。
2、客户端连接 MongoDB 数据库分为两种,当 MongoDB 服务器开启了安全认证时,则客户端必须进行安全认证连接。
演示代码:doc/javaDemo/MongoDBTest.java · 汪少棠/material - Gitee.com。
CRUD 集合
1、集合操作同样包括 集合创建、查询、删除 等
2、如下所示为显示的 创建集合。隐式创建 集合 与 隐式创建数据库一致,直接添加数据就会自动创建。
演示代码:doc/javaDemo/MongoCollectionTest.java · 汪少棠/material - Gitee.com。
CRUD 文档
- com.mongodb.client.MongoCollection#find(org.bson.conversions.Bson):条件查询,条件查询是用的最多的,其它的修改,替换,删除都要依靠。
- find 方法中的参数 org.bson.conversions.Bson 是一个接口,可以使用 com.mongodb.client.model.Filters 进行创建,所有的条件都可以通过 Filters 进行创建,如下所示为类中的静态方法:
Bson eq(final String fieldName, @Nullable final TItem value):查询 fieldName 的值等于 value 的文档
Bson lt(final String fieldName, final TItem value):查询 fieldName 的值小于 value 的文档
Bson lte(final String fieldName, final TItem value):查询 fieldName 的值小于等于 value 的文档
Bson gt(final String fieldName, final TItem value):查询 fieldName 的值大于 value 的文档
Bson gte(final String fieldName, final TItem value):查询 fieldName 的值大等于 value 的文档
Bson exists(final String fieldName):查询含有 fieldName 字段的文档
Bson exists(final String fieldName, final boolean exists):当 exists 为 true 时,则表示 查询含有 fieldName字段的文档;当 exists 为 false 时,表示 查询不含有 fieldName 字段的文档
Bson in(final String fieldName, final TItem... values):查询 fieldName 的值在 values 数组中的文档
Bson nin(final String fieldName, final TItem... values):查询 fieldName 的值不在 values 数组中的文档
Bson and(final Bson... filters):组合查询,逻辑与
Bson or(final Iterable<Bson> filters):组合查询,逻辑或
Bson not(final Bson filter):组合查询,逻辑非
- com.mongodb.client.FindIterable#sort:对结果进行排序输出,这是很常见的操作,比如按着日期排序,年龄排序,姓名排序等
- 使用 FindIterable 迭代器的 FindIterable<TResult> sort(@Nullable Bson sort) 方法,而其中的 Bson 通过 com.mongodb.client.model.Sorts 来创建,类中提供了静态方法,可以直接调用:
- Bson ascending(final String... fieldNames):以 fieldNames 字段进行从小到大的升序排列
- Bson descending(final String... fieldNames):以 fieldNames 字段进行从大到小的降序排列
- Bson orderBy(final Bson... sorts):组合排序,先根据第一个 bson 排序,当第一个 bson 排序字段的值有相同时,再根据第二个 bson 进行排序,依此类推。
- com.mongodb.client.FindIterable#projection:字段过滤查询,有时候并不需要整个文档的所有字段,而只是取其中部分字段时,这时可以过滤。
- 使用 FindIterable 的 FindIterable<TResult> projection(@Nullable Bson projection) 方法,方法中的参数需要由 com.mongodb.client.model.Projections 类提供,其中的静态方法如下:
Bson excludeId():结果文档将不会再有 _id 主键字段
Bson exclude(final String... fieldNames):排除哪些字段不再显示
Bson include(final String... fieldNames):指定哪些字段进行显示
Bson fields(final Bson... projections):组合过滤,相当于逻辑与
- com.mongodb.client.MongoCollection#findOneAndDelete(org.bson.conversions.Bson):查询并删除文档,取值之后,原来的值就会被删除,值只能取一次,可用于做消息队列等场景。
- 如果有多条值满足条件,只取第一条
- 对于集合中的文档遍历方式之一是如下所示,先获取迭代器,然后根据迭代器获取游标,最后遍历游标进行取值
FindIterable<Document> documentFindIterable = mongoCollection.find();
MongoCursor<Document> documentMongoCursor = documentFindIterable.iterator();
- 同时 MongoCollection 直接提供了遍历的 forEach 方法,如下所示重载的两个方法,效果完全一致:
forEach(Block<? super TResult> block)
forEach(Consumer<? super T> action)
代码演示:doc/javaDemo/MongoDocumentTest.java · 汪少棠/material - Gitee.com。
Bulk 批量操作
1、MongoDB 提供了一种称为 BulkWrite(块)操作方式,数据不会被立即被持久化到数据库中,而是等待程序调度,确定合适的时间持久化到数据库中,其实就是批量操作。
2、API :com.mongodb.client.MongoCollection#bulkWrite(java.util.List<? extends com.mongodb.client.model.WriteModel<? extends TDocument>>)
3、Bulk 操作支持有序操作,和无序操作两种模式。
4、有序操作的数据,会按照顺序操作,一旦发生错误,操作就会终止;无序操作,不安顺序执行,只会报告哪些操作发生了错误。
5、Bulk 操作支持增删改三种操作,对应的 model 分别是 :
InsertOneModel(final T document):单文档添加模型
UpdateOneModel(final Bson filter, final Bson update):单文档更新模型
UpdateManyModel(final Bson filter, final Bson update):多文档更新模型
DeleteOneModel(final Bson filter):单文档删除模型
DeleteManyModel(final Bson filter):多文档删除模型
ReplaceOneModel(final Bson filter, final T replacement):单文档替换模型
它们都继承于 com.mongodb.client.model.WriteModel。
有序操作
有序批量操作的数据,会按照顺序操作,中间一旦发生错误,操作就会终止,即后面的 Model 不会再执行;
使用:BulkWriteResult bulkWrite(List<? extends WriteModel<? extends TDocument>> requests)
代码演示:doc/javaDemo/MongoDocumentExt.java · 汪少棠/material - Gitee.com。
无序操作
无序操作,不按顺序执行,只会报告哪些操作发生了错误,发送错误后,其余的 操作不受影响,继续执行。
使用:BulkWriteResult bulkWrite(List<? extends WriteModel<? extends TDocument>> requests, BulkWriteOptions options)
代码演示:doc/javaDemo/MongoDocumentExt.java · 汪少棠/material - Gitee.com。