構成

次の例に示すように、次の構成を使用して MongoTemplate のインスタンスを作成および登録できます。

MongoClient オブジェクトの登録と Spring の例外変換サポートの有効化
  • 命令的

  • リアクティブ

  • XML

@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>

MongoTemplate (Javadoc) ReactiveMongoTemplate (Javadoc) には、オーバーロードされたコンストラクターがいくつかあります。

  • MongoTemplate(MongoClient mongo, String databaseName)MongoClient オブジェクトと操作対象のデフォルトのデータベース名を受け取ります。

  • MongoTemplate(MongoDatabaseFactory mongoDbFactory)MongoClient オブジェクト、データベース名、ユーザー名とパスワードをカプセル化した MongoDbFactory オブジェクトを受け取ります。

  • MongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoConverter mongoConverter): マッピングに使用する MongoConverter を追加します。

MongoTemplate / ReactiveMongoTemplate の作成時に設定できるその他のオプションのプロパティは、デフォルトの WriteResultCheckingPolicyWriteConcernReadPreference および以下にリストされているその他のプロパティです。

デフォルトの読み取り設定

クエリを介して他の設定が定義されていない場合、デフォルトの読み取り設定が読み取り操作に適用されます。

WriteResultChecking ポリシー

開発中、MongoDB 操作から返された com.mongodb.WriteResult にエラーが含まれている場合、ログに記録するか例外をスローすると便利です。開発中にこれを行うのを忘れて、実際にはデータベースが期待どおりに変更されていないにもかかわらず、アプリケーションが正常に実行されているように見えることになることがよくあります。MongoTemplate の WriteResultChecking プロパティを次の値のいずれかに設定できます: EXCEPTION または NONE で、それぞれ Exception をスローするか、何も実行しません。デフォルトでは、WriteResultChecking 値 NONE が使用されます。

デフォルトの WriteConcern

上位レベル ( com.mongodb.client.MongoClient など) のドライバーを通じてまだ指定されていない場合は、MongoTemplate が書き込み操作に使用する com.mongodb.WriteConcern プロパティを設定できます。WriteConcern プロパティが設定されていない場合は、MongoDB ドライバーの DB またはコレクション設定で設定されたものがデフォルトになります。

WriteConcernResolver

操作ごと (削除、更新、挿入、保存操作) に異なる WriteConcern 値を設定するさらに高度なケースでは、WriteConcernResolver と呼ばれる戦略インターフェースを MongoTemplate で構成できます。MongoTemplate は POJO を永続化するために使用されるため、WriteConcernResolver を使用すると、特定の POJO クラスを WriteConcern 値にマップできるポリシーを作成できます。次のリストは、WriteConcernResolver インターフェースを示しています。

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

MongoAction 引数を使用して WriteConcern 値を決定することも、テンプレート自体の値をデフォルトとして使用することもできます。MongoAction には、書き込まれるコレクション名、POJO の java.lang.Class、変換された Document、操作 (REMOVEUPDATEINSERTINSERT_LIST または SAVE)、およびその他のいくつかのコンテキスト情報が含まれます。次の例は、異なる WriteConcern 設定を取得する 2 つのクラスセットを示しています。

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 を呼び出します。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 に委譲されます。詳細については、ドキュメントの数を数えるセクションを参照してください。