MongoDB 原生组件 CRUD 数据库、集合、文档、批量操作

本文详细介绍如何使用Java操作MongoDB数据库,涵盖连接驱动配置、数据库、集合与文档的CRUD操作,以及批量与排序查询技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

准备依赖

启动 MongoDB 数据库

CRUD 数据库

CRUD 集合

CRUD 文档

Bulk 批量操作

有序操作

无序操作


本文导读

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚩尤后裔-汪茂雄

芝兰生于深林,不以无人而不芳。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值