此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Data MongoDB 5.0.4spring-doc.cadn.net.cn

配置

您可以使用以下配置来创建并注册一个 MongoTemplate 实例,如下例所示:spring-doc.cadn.net.cn

注册一个 MongoClient 对象并启用 Spring 的异常转换支持
@Configuration
class ApplicationConfiguration {

  @Bean
  MongoClient mongoClient() {
      return MongoClients.create("mongodb://localhost:27017");
  }

  @Bean
  MongoOperations mongoTemplate(MongoClient mongoClient) {
      return new MongoTemplate(mongoClient, "geospatial");
  }
}
@Configuration
class ReactiveApplicationConfiguration {

  @Bean
  MongoClient mongoClient() {
      return MongoClients.create("mongodb://localhost:27017");
  }

  @Bean
  ReactiveMongoOperations mongoTemplate(MongoClient mongoClient) {
      return new ReactiveMongoTemplate(mongoClient, "geospatial");
  }
}
<mongo:mongo-client host="localhost" port="27017" />

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
  <constructor-arg ref="mongoClient" />
  <constructor-arg name="databaseName" value="geospatial" />
</bean>

MongoTemplateReactiveMongoTemplate 有多个重载构造函数:spring-doc.cadn.net.cn

  • MongoTemplate(MongoClient mongo, String databaseName):接收 MongoClient 对象和默认数据库名称,用于执行操作。spring-doc.cadn.net.cn

  • MongoTemplate(MongoDatabaseFactory mongoDbFactory):接收一个 MongoDbFactory 对象,该对象封装了 MongoClient 对象、数据库名称以及用户名和密码。spring-doc.cadn.net.cn

  • MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter):添加一个用于映射的 MongoConverterspring-doc.cadn.net.cn

在创建 MongoTemplate / ReactiveMongoTemplate 时,你可能还希望设置其他一些可选属性,例如默认的 WriteResultCheckingPolicyWriteConcernReadPreference 以及下面列出的其他属性。spring-doc.cadn.net.cn

默认读取偏好

如果没有通过Query定义其他读取偏好,则应用于读取操作的默认读取偏好。spring-doc.cadn.net.cn

写入结果检查策略

在开发过程中,如果从任何 MongoDB 操作返回的 com.mongodb.WriteResult 包含错误,记录日志或抛出异常是非常方便的做法。在开发过程中很容易忘记这样做,结果导致应用程序看似成功运行,而实际上数据库并未按照预期进行修改。您可以将 WriteResultCheckingMongoTemplate 属性设置为以下值之一:EXCEPTIONNONE,分别表示抛出 Exception 或不执行任何操作。默认情况下,WriteResultChecking 的值为 NONEspring-doc.cadn.net.cn

默认写入关注

如果尚未通过更高层级的驱动程序(例如 com.mongodb.client.MongoClient)指定,则可以设置 com.mongodb.WriteConcern 在写操作中使用的 MongoTemplate 属性。如果未设置 WriteConcern 属性,则默认使用 MongoDB 驱动程序中数据库或集合所配置的 WriteConcern。spring-doc.cadn.net.cn

写入关注解析器

对于更高级的场景,如果您希望在每次操作(如删除、更新、插入和保存操作)时设置不同的 WriteConcern 值,可以在 WriteConcernResolver 上配置一个名为 MongoTemplate 的策略接口。由于 MongoTemplate 用于持久化 POJO,WriteConcernResolver 允许您创建一种策略,将特定的 POJO 类映射到一个 WriteConcern 值。以下代码展示了 WriteConcernResolver 接口:spring-doc.cadn.net.cn

public interface WriteConcernResolver {
  WriteConcern resolve(MongoAction action);
}

您可以使用 MongoAction 参数来确定 WriteConcern 的值,或者直接使用模板本身的值作为默认值。 MongoAction 包含正在写入的集合名称、POJO 的 java.lang.Class、转换后的 Document、操作类型(REMOVEUPDATEINSERTINSERT_LISTSAVE)以及一些其他上下文信息。 以下示例展示了两组类如何应用不同的 WriteConcern 设置:spring-doc.cadn.net.cn

public class MyAppWriteConcernResolver implements WriteConcernResolver {

  @Override
  public WriteConcern resolve(MongoAction action) {
    if (action.getEntityType().getSimpleName().contains("Audit")) {
      return WriteConcern.ACKNOWLEDGED;
    } else if (action.getEntityType().getSimpleName().contains("Metadata")) {
      return WriteConcern.JOURNALED;
    }
    return action.getDefaultWriteConcern();
  }
}

发布实体生命周期事件

该模板会发布生命周期事件。 如果没有监听器存在,此功能可以被禁用。spring-doc.cadn.net.cn

@Bean
MongoOperations mongoTemplate(MongoClient mongoClient) {
    MongoTemplate template = new MongoTemplate(mongoClient, "geospatial");
	template.setEntityLifecycleEventsEnabled(false);
	// ...
}

配置 EntityCallbacks

除了生命周期事件外,模板还会调用EntityCallbacks,这些回调可以通过模板 API 进行设置(如果未自动配置的话)。spring-doc.cadn.net.cn

@Bean
MongoOperations mongoTemplate(MongoClient mongoClient) {
    MongoTemplate template = new MongoTemplate(mongoClient, "...");
	template.setEntityCallbacks(EntityCallbacks.create(...));
	// ...
}
@Bean
ReactiveMongoOperations mongoTemplate(MongoClient mongoClient) {
    ReactiveMongoTemplate template = new ReactiveMongoTemplate(mongoClient, "...");
	template.setEntityCallbacks(ReactiveEntityCallbacks.create(...));
	// ...
}

文档数量配置

通过将 MongoTemplate#useEstimatedCount(…​) 设置为 true,当 MongoTemplate#count(…​) 操作使用空的过滤查询时,只要当前没有活跃的事务,并且模板未绑定到会话,该操作就会被委托给 client-session-transactions.html。 更多详细信息,请参阅统计文档数量一节。spring-doc.cadn.net.cn