对于最新的稳定版本,请使用 Spring Data MongoDB 4.4.0! |
模板 API
这MongoTemplate
及其响应式对应类,位于org.springframework.data.mongodb.core
包是 Spring 的 MongoDB 支持的中心类,并为与数据库交互提供了丰富的功能集。
该模板提供了创建、更新、删除和查询 MongoDB 文档的便捷作,并提供了域对象和 MongoDB 文档之间的映射。
配置完成后,MongoTemplate 是线程安全的,并且可以在多个实例之间重用。 |
便捷方法
这MongoTemplate
类实现接口MongoOperations
.
尽可能地使用MongoOperations
以 MongoDB 驱动程序上可用的方法命名Collection
对象,以使习惯于驱动程序 API 的现有 MongoDB 开发人员熟悉 API。
例如,您可以找到find
,findAndModify
,findAndReplace
,findOne
,insert
,remove
,save
,update
和updateMulti
.
设计目标是尽可能轻松地在基本 MongoDB 驱动程序和MongoOperations
.
这两个 API 之间的主要区别在于MongoOperations
可以传递域对象而不是Document
.
也MongoOperations
具有 Fluent APIQuery
,Criteria
和Update
作,而不是填充Document
以指定这些作的参数。
引用MongoTemplate instance 通过其接口,MongoOperations . |
执行回调
MongoTemplate
提供了许多便捷的方法来帮助您轻松执行常见任务。
但是,如果您需要直接访问 MongoDB 驱动程序 API,则可以使用以下几种Execute
callback 方法。
这execute
callbacks 为您提供对MongoCollection
或MongoDatabase
对象。
-
<T> T
执行(Class<?> entityClass, CollectionCallback<T> action)
:运行给定的CollectionCallback
对于指定类的实体集合。 -
<T> T
执行(String collectionName, CollectionCallback<T> action)
:运行给定的CollectionCallback
在给定名称的集合上。 -
<T> T
执行(DbCallback<T> action)
:运行 DbCallback,根据需要转换任何异常。Spring Data MongoDB 为版本 2.2 中引入 MongoDB 的聚合框架提供支持。 -
<T> T
执行(String collectionName, DbCallback<T> action)
:运行DbCallback
在给定名称的集合上,根据需要翻译任何异常。 -
<T> T
executeInSession(DbCallback<T> action)
:运行给定的DbCallback
在与数据库的同一连接中,以确保在写入密集型环境中的一致性,在该环境中,您可以读取您写入的数据。
以下示例使用CollectionCallback
要返回有关索引的信息,请执行以下作:
-
Imperative
-
Reactive
boolean hasIndex = template.execute("geolocation", collection ->
Streamable.of(collection.listIndexes(org.bson.Document.class))
.stream()
.map(document -> document.get("name"))
.anyMatch("location_2d"::equals)
);
Mono<Boolean> hasIndex = template.execute("geolocation", collection ->
Flux.from(collection.listIndexes(org.bson.Document.class))
.map(document -> document.get("name"))
.filterWhen(name -> Mono.just("location_2d".equals(name)))
.map(it -> Boolean.TRUE)
.single(Boolean.FALSE)
).next();
Fluent API
在与 MongoDB 进行更多底层交互时,成为中心组件MongoTemplate
提供了广泛的方法,涵盖了从集合创建、索引创建和 CRUD作到更高级功能(如 Map-Reduce 和聚合)的需求。
您可以找到每个方法的多个重载。
它们中的大多数涵盖了 API 的可选或可为 null 的部分。
FluentMongoOperations
为常见的MongoOperations
并提供更易读、更流畅的 API。
入口点 (insert(…)
,find(…)
,update(…)
等)遵循基于要运行的作的自然命名架构。
从入口点开始,API 旨在仅提供依赖于上下文的方法,这些方法会导致调用实际MongoOperations
counterpart — 的all
method:
-
Imperative
-
Reactive
List<Jedi> all = template.query(SWCharacter.class) (1)
.inCollection("star-wars") (2)
.as(Jedi.class) (3)
.matching(query(where("jedi").is(true))) (4)
.all();
1 | 用于将查询中使用的字段映射到的类型。 |
2 | 如果未在域类型上定义,则要使用的集合名称。 |
3 | Result 类型(如果不使用原始域类型)。 |
4 | 查找查询。 |
Flux<Jedi> all = template.query(SWCharacter.class)
.inCollection("star-wars")
.as(Jedi.class)
.matching(query(where("jedi").is(true)))
.all();
使用投影允许MongoTemplate 通过将实际响应限制为 required 字段来优化结果映射
按 Projection Target type。只要Query 本身不包含任何字段限制,
目标类型是封闭界面或 DTO 投影。 |
投影不得应用于 DBRefs。 |
您可以在检索单个实体和将多个实体作为List
或Stream
通过终止方法:first()
,one()
,all()
或stream()
.
使用near(NearQuery)
时,终止方法的数量将更改为仅包含对运行geoNear
命令(将实体作为GeoResult
在GeoResults
),如下例所示:
-
Imperative
-
Reactive
GeoResults<Jedi> results = template.query(SWCharacter.class)
.as(Jedi.class)
.near(alderaan) // NearQuery.near(-73.9667, 40.78).maxDis…
.all();
Flux<GeoResult<Jedi>> results = template.query(SWCharacter.class)
.as(Jedi.class)
.near(alderaan) // NearQuery.near(-73.9667, 40.78).maxDis…
.all();
异常转换
Spring 框架为各种数据库和 Map 技术提供了异常转换。T
他传统上是 JDBC 和 JPA 的。
Spring 对 MongoDB 的支持通过提供org.springframework.dao.support.PersistenceExceptionTranslator
接口。
映射到 Spring 的一致数据访问异常层次结构的动机是,您能够编写可移植的描述性异常处理代码,而无需针对 MongoDB 错误代码进行编码。
Spring 的所有数据访问异常都是从根继承的DataAccessException
类,以便您可以确保在单个 try-catch 块中捕获所有与数据库相关的异常。
请注意,并非所有 MongoDB 驱动程序引发的异常都继承自MongoException
类。
内部异常和消息被保留,因此不会丢失任何信息。
由MongoExceptionTranslator
是com.mongodb.Network to DataAccessResourceFailureException
和MongoException
错误代码 1003、12001、12010、12011 和 12012 更改为InvalidDataAccessApiUsageException
.
有关映射的更多详细信息,请查看 implementation 。
域类型映射
MongoDB 文档和域类之间的映射是通过委托给MongoConverter
接口。
Spring 提供MappingMongoConverter
,但您也可以编写自己的转换器。
虽然MappingMongoConverter
可以使用其他元数据来指定对象到文档的映射,它还可以通过对 ID 和集合名称的映射使用一些约定来转换不包含其他元数据的对象。
这些约定以及 Mapping 注释的使用将在 Mapping 一章中解释。