構成
次の例に示すように、次の構成を使用して 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
の作成時に設定できるその他のオプションのプロパティは、デフォルトの WriteResultCheckingPolicy
、WriteConcern
、ReadPreference
および以下にリストされているその他のプロパティです。
デフォルトの読み取り設定
クエリを介して他の設定が定義されていない場合、デフォルトの読み取り設定が読み取り操作に適用されます。
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
、操作 (REMOVE
、UPDATE
、INSERT
、INSERT_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
に委譲されます。詳細については、ドキュメントの数を数えるセクションを参照してください。