对于最新的稳定版本,请使用 Spring Data MongoDB 4.4.0spring-doc.cadn.net.cn

模板 API

MongoTemplate及其响应式对应类,位于org.springframework.data.mongodb.core包是 Spring 的 MongoDB 支持的中心类,并为与数据库交互提供了丰富的功能集。 该模板提供了创建、更新、删除和查询 MongoDB 文档的便捷作,并提供了域对象和 MongoDB 文档之间的映射。spring-doc.cadn.net.cn

配置完成后,MongoTemplate是线程安全的,并且可以在多个实例之间重用。

便捷方法

MongoTemplate类实现接口MongoOperations. 尽可能地使用MongoOperations以 MongoDB 驱动程序上可用的方法命名Collection对象,以使习惯于驱动程序 API 的现有 MongoDB 开发人员熟悉 API。 例如,您可以找到find,findAndModify,findAndReplace,findOne,insert,remove,save,updateupdateMulti. 设计目标是尽可能轻松地在基本 MongoDB 驱动程序和MongoOperations. 这两个 API 之间的主要区别在于MongoOperations可以传递域对象而不是Document. 也MongoOperations具有 Fluent APIQuery,CriteriaUpdate作,而不是填充Document以指定这些作的参数。spring-doc.cadn.net.cn

有关更多信息,请参阅文档的 CRUDQuery 部分。spring-doc.cadn.net.cn

引用MongoTemplateinstance 通过其接口,MongoOperations.

执行回调

MongoTemplate提供了许多便捷的方法来帮助您轻松执行常见任务。 但是,如果您需要直接访问 MongoDB 驱动程序 API,则可以使用以下几种Executecallback 方法。 这executecallbacks 为您提供对MongoCollectionMongoDatabase对象。spring-doc.cadn.net.cn

  • <T> T 执行 (Class<?> entityClass, CollectionCallback<T> action):运行给定的CollectionCallback对于指定类的实体集合。spring-doc.cadn.net.cn

  • <T> T 执行 (String collectionName, CollectionCallback<T> action):运行给定的CollectionCallback在给定名称的集合上。spring-doc.cadn.net.cn

  • <T> T 执行 (DbCallback<T> action):运行 DbCallback,根据需要转换任何异常。Spring Data MongoDB 为版本 2.2 中引入 MongoDB 的聚合框架提供支持。spring-doc.cadn.net.cn

  • <T> T 执行 (String collectionName, DbCallback<T> action):运行DbCallback在给定名称的集合上,根据需要翻译任何异常。spring-doc.cadn.net.cn

  • <T> T executeInSession (DbCallback<T> action):运行给定的DbCallback在与数据库的同一连接中,以确保在写入密集型环境中的一致性,在该环境中,您可以读取您写入的数据。spring-doc.cadn.net.cn

以下示例使用CollectionCallback要返回有关索引的信息,请执行以下作:spring-doc.cadn.net.cn

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 的部分。spring-doc.cadn.net.cn

FluentMongoOperations为常见的MongoOperations并提供更易读、更流畅的 API。 入口点 (insert(…),find(…),update(…)等)遵循基于要运行的作的自然命名架构。 从入口点开始,API 旨在仅提供依赖于上下文的方法,这些方法会导致调用实际MongoOperationscounterpart — 的allmethod:spring-doc.cadn.net.cn

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

您可以在检索单个实体和将多个实体作为ListStream通过终止方法:first(),one(),all()stream().spring-doc.cadn.net.cn

使用near(NearQuery)时,终止方法的数量将更改为仅包含对运行geoNear命令(将实体作为GeoResultGeoResults),如下例所示:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

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

MongoExceptionTranslatorcom.mongodb.Network to DataAccessResourceFailureExceptionMongoException错误代码 1003、12001、12010、12011 和 12012 更改为InvalidDataAccessApiUsageException. 有关映射的更多详细信息,请查看 implementation 。spring-doc.cadn.net.cn

域类型映射

MongoDB 文档和域类之间的映射是通过委托给MongoConverter接口。 Spring 提供MappingMongoConverter,但您也可以编写自己的转换器。 虽然MappingMongoConverter可以使用其他元数据来指定对象到文档的映射,它还可以通过对 ID 和集合名称的映射使用一些约定来转换不包含其他元数据的对象。 这些约定以及 Mapping 注释的使用将在 Mapping 一章中解释。spring-doc.cadn.net.cn