最新的稳定版请使用 Spring Data MongoDB 4.3.1Spring中文文档

最新的稳定版请使用 Spring Data MongoDB 4.3.1Spring中文文档

位于软件包中的响应式对应类是 Spring 的 MongoDB 支持的核心类,它提供了用于与数据库交互的丰富功能集。 该模板提供了创建、更新、删除和查询 MongoDB 文档的便捷操作,并提供域对象和 MongoDB 文档之间的映射。MongoTemplateorg.springframework.data.mongodb.coreSpring中文文档

配置后,它是线程安全的,可以在多个实例中重复使用。MongoTemplate
配置后,它是线程安全的,可以在多个实例中重复使用。MongoTemplate

便利方法

该类实现接口 。 在尽可能的情况下,on 的方法以 MongoDB 驱动程序对象上可用的方法命名,以使习惯驱动程序 API 的现有 MongoDB 开发人员熟悉 API。 例如,您可以找到 、 、 、 、 和 等方法。 设计目标是尽可能轻松地在基本 MongoDB 驱动程序的使用和 . 这两个 API 之间的主要区别在于可以传递域对象而不是 . 此外,还具有用于 、 和 操作的 Fluent API,而不是填充 a 来指定这些操作的参数。MongoTemplateMongoOperationsMongoOperationsCollectionfindfindAndModifyfindAndReplacefindOneinsertremovesaveupdateupdateMultiMongoOperationsMongoOperationsDocumentMongoOperationsQueryCriteriaUpdateDocumentSpring中文文档

有关详细信息,请参阅文档的 CRUD查询部分。Spring中文文档

引用实例上的操作的首选方法是通过其接口 。MongoTemplateMongoOperations
引用实例上的操作的首选方法是通过其接口 。MongoTemplateMongoOperations

执行回调

MongoTemplate提供了许多方便的方法,帮助您轻松执行常见任务。 但是,如果您需要直接访问 MongoDB 驱动程序 API,则可以使用多种回调方法之一。 回调为您提供对 a 或 object 的引用。ExecuteexecuteMongoCollectionMongoDatabaseSpring中文文档

  • <T> T execute :为指定类的实体集合运行给定的 name。(Class<?> entityClass, CollectionCallback<T> action)CollectionCallbackSpring中文文档

  • <T> T execute :在给定名称的集合上运行给定的。(String collectionName, CollectionCallback<T> action)CollectionCallbackSpring中文文档

  • <T> T execute :运行 DbCallback,根据需要转换任何异常。Spring Data MongoDB 支持 2.2 版中引入的 MongoDB 聚合框架。(DbCallback<T> action)Spring中文文档

  • <T> T execute :对给定名称的集合运行 a,根据需要转换任何异常。(String collectionName, DbCallback<T> action)DbCallbackSpring中文文档

  • <T> T executeInSession :在与数据库的同一连接中运行给定的,以确保在写入密集型环境中的一致性,您可以在其中读取您写入的数据。(DbCallback<T> action)DbCallbackSpring中文文档

下面的示例使用 返回有关索引的信息:CollectionCallbackSpring中文文档

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进行更低级交互的核心组件,它提供了广泛的方法,涵盖了从集合创建,索引创建和CRUD操作到更高级的功能(如Map-Reduce和聚合)的需求。 您可以为每种方法找到多个重载。 它们中的大多数涵盖了 API 的可选或可为 null 的部分。MongoTemplateSpring中文文档

FluentMongoOperations为常用方法提供更窄的接口,并提供更易读、更流畅的 API。 入口点(、、 等)遵循基于要运行的操作的自然命名架构。 从入口点开始,API 旨在仅提供上下文相关的方法,这些方法会导致调用实际对应项的终止方法(以下示例中的方法):MongoOperationsinsert(…)find(…)update(…)MongoOperationsallSpring中文文档

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 结果类型(如果不使用原始域类型)。
4 查找查询。
Flux<Jedi> all = template.query(SWCharacter.class)
  .inCollection("star-wars")
  .as(Jedi.class)
  .matching(query(where("jedi").is(true)))
  .all();
使用投影可以通过将实际响应限制为所需字段来优化结果映射 按投影目标类型。只要本身不包含任何字段限制,并且 目标类型是闭合接口或 DTO 投影。MongoTemplateQuery
不得将投影应用于 DBRefs

您可以通过以下终止方法在检索单个实体和以 a 或 a 形式检索多个实体之间切换:、 、 或 。ListStreamfirst()one()all()stream()Spring中文文档

当使用 编写地理空间查询时,终止方法的数量被更改为仅包括对在 MongoDB 中运行命令有效的方法(将实体作为内部获取),如以下示例所示:near(NearQuery)geoNearGeoResultGeoResultsSpring中文文档

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();
1 用于将查询中使用的字段映射到的类型。
2 如果未在域类型上定义,则要使用的集合名称。
3 结果类型(如果不使用原始域类型)。
4 查找查询。
使用投影可以通过将实际响应限制为所需字段来优化结果映射 按投影目标类型。只要本身不包含任何字段限制,并且 目标类型是闭合接口或 DTO 投影。MongoTemplateQuery
不得将投影应用于 DBRefs

异常翻译

Spring 框架为各种数据库和映射技术提供了异常转换。T 他传统上是为 JDBC 和 JPA 服务的。 Spring 对 MongoDB 的支持通过提供接口的实现将此功能扩展到 MongoDB 数据库。org.springframework.dao.support.PersistenceExceptionTranslatorSpring中文文档

映射到 Spring 一致的数据访问异常层次结构背后的动机是,您可以编写可移植和描述性的异常处理代码,而无需针对 MongoDB 错误代码进行编码。 Spring 的所有数据访问异常都是从根类继承而来的,因此您可以确保在单个 try-catch 块中捕获所有与数据库相关的异常。 请注意,并非所有MongoDB驱动程序引发的异常都继承自该类。 保留内部异常和消息,以便不会丢失任何信息。DataAccessExceptionMongoExceptionSpring中文文档

由 are 和错误代码 1003、12001、12010、12011 和 12012 执行的一些映射到 . 有关映射的更多详细信息,请查看实现。MongoExceptionTranslatorcom.mongodb.Network to DataAccessResourceFailureExceptionMongoExceptionInvalidDataAccessApiUsageExceptionSpring中文文档

域类型映射

MongoDB文档和域类之间的映射是通过委托给接口的实现来完成的。 Spring 提供了 ,但您也可以编写自己的转换器。 虽然可以使用其他元数据来指定对象到文档的映射,但它也可以通过使用一些 ID 和集合名称映射的约定来转换不包含其他元数据的对象。 这些约定以及映射注释的使用在映射章节中进行了解释。MongoConverterMappingMongoConverterMappingMongoConverterSpring中文文档