此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data MongoDB 4.5.2spring-doc.cadn.net.cn

模板 API

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

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

方便方法

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

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

引用MongoTemplate实例通过其接口,MongoOperations.

执行回调

MongoTemplate提供了许多方便的方法来帮助您轻松执行常见任务。 但是,如果您需要直接访问 MongoDB 驱动程序 API,则可以使用以下几种Execute回调方法。 这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 执行会话中 (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();

流畅的 API

在与 MongoDB 进行更低级交互时,成为核心组件MongoTemplate提供了广泛的方法,涵盖从集合创建、索引创建和 CRUD作到更高级功能(例如 Map-Reduce 和聚合)的需求。 您可以找到每种方法的多个重载。 它们中的大多数涵盖了 API 的可选或可为 null 部分。spring-doc.cadn.net.cn

FluentMongoOperations为常用方法提供了更窄的接口MongoOperations并提供更具可读性、流畅的 API。 入口点 (insert(…),find(…),update(…)等)遵循基于要运行的作的自然命名模式。 从入口点开始,API 旨在仅提供依赖于上下文的方法,这些方法会导致调用实际MongoOperationscounterpart —all方法: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 如果未使用原始域类型,则为结果类型。
4 查找查询。
反应性的
Flux<Jedi> all = template.query(SWCharacter.class)
  .inCollection("star-wars")
  .as(Jedi.class)
  .matching(query(where("jedi").is(true)))
  .all();
使用投影允许MongoTemplate通过将实际响应限制为投影目标类型所需的字段来优化结果映射。 只要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 框架为各种数据库和映射技术提供了异常转换。 传统上,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.NetworkDataAccessResourceFailureExceptionMongoException错误代码 1003、12001、12010、12011 和 12012 到InvalidDataAccessApiUsageException. 查看实现以获取有关映射的更多详细信息。spring-doc.cadn.net.cn

异常转换可以通过设置自定义的MongoExceptionTranslator在您的MongoDatabaseFactory或其反应性变体。 您可能还想在相应的MongoClientFactoryBean.spring-doc.cadn.net.cn

示例 1.配置MongoExceptionTranslator
ConnectionString uri = new ConnectionString("mongodb://username:password@localhost/database");
SimpleMongoClientDatabaseFactory mongoDbFactory = new SimpleMongoClientDatabaseFactory(uri);
mongoDbFactory.setExceptionTranslator(myCustomExceptionTranslator);

自定义异常的动机可能是MongoDB在事务期间的行为,其中某些故障(例如写入冲突)可能会成为暂时性的,并且重试可能会导致成功的作。 在这种情况下,您可以使用特定的 MongoDB 标签包装异常并应用不同的异常转换策略。spring-doc.cadn.net.cn

域类型映射

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