配置

您可以使用以下配置创建和注册 MongoTemplate 的实例,如下例所示

注册 MongoClient 对象并启用 Spring 的异常转换支持
  • 命令式

  • 响应式

  • XML

@Configuration
class ApplicationConfiguration {

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

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

  @Bean
  MongoClient mongoClient() {
      return MongoClients.create("mongodb://127.0.0.1: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 有几个重载的构造函数

  • MongoTemplate(MongoClient mongo, String databaseName):接受 MongoClient 对象和要操作的默认数据库名称。

  • MongoTemplate(MongoDatabaseFactory mongoDbFactory):接受一个 MongoDbFactory 对象,该对象封装了 MongoClient 对象、数据库名称以及用户名和密码。

  • MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter):添加一个 MongoConverter 用于映射。

在创建 MongoTemplate / ReactiveMongoTemplate 时,您可能希望设置的其他可选属性包括默认的 WriteResultCheckingPolicyWriteConcernReadPreference 以及下面列出的其他属性。

默认读取偏好

如果在 查询 中没有定义其他偏好,则应用于读取操作的默认读取偏好。

WriteResultChecking 策略

在开发过程中,如果从任何 MongoDB 操作返回的 com.mongodb.WriteResult 包含错误,则记录或抛出异常非常有用。在开发过程中,很容易忘记这样做,然后最终得到一个看起来运行成功的应用程序,而实际上数据库并没有按照您的预期进行修改。您可以将 MongoTemplateWriteResultChecking 属性设置为以下值之一:EXCEPTIONNONE,分别表示抛出 Exception 或不执行任何操作。默认情况下,使用 WriteResultCheckingNONE

默认写入关注

如果尚未通过驱动程序在更高级别(例如 com.mongodb.client.MongoClient)指定,则可以设置 MongoTemplate 用于写入操作的 com.mongodb.WriteConcern 属性。如果未设置 WriteConcern 属性,则默认为 MongoDB 驱动程序的 DB 或 Collection 设置中设置的属性。

WriteConcernResolver

对于更高级的情况,如果您希望在每个操作的基础上设置不同的 WriteConcern 值(对于删除、更新、插入和保存操作),可以在 MongoTemplate 上配置一个名为 WriteConcernResolver 的策略接口。由于 MongoTemplate 用于持久化 POJO,因此 WriteConcernResolver 允许您创建一个策略,该策略可以将特定 POJO 类映射到 WriteConcern 值。以下列表显示了 WriteConcernResolver 接口

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

您可以使用 MongoAction 参数来确定 WriteConcern 值,或者使用模板本身的值作为默认值。MongoAction 包含要写入的集合名称、POJO 的 java.lang.Class、转换后的 Document、操作(REMOVEUPDATEINSERTINSERT_LISTSAVE)以及其他一些上下文信息。以下示例显示了两组类获得不同的 WriteConcern 设置

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();
  }
}

发布实体生命周期事件

该模板发布了生命周期事件。如果不存在监听器,则可以禁用此功能。

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

配置 EntityCallbacks

模板调用EntityCallbacks以响应生命周期事件,这些回调可以(如果未自动配置)通过模板 API 设置。

  • 命令式

  • 响应式

@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(…​) 操作将委托给 estimatedCount,只要没有活动的事务并且模板未绑定到会话。有关更多信息,请参阅计数文档部分。