最新の安定バージョンについては、Spring Data MongoDB 5.0.0 を使用してください!

型マッピング

MongoDB コレクションには、さまざまな型のインスタンスを表すドキュメントを含めることができます。この機能は、クラスの階層を保存する場合、または Object 型のプロパティを持つクラスがある場合に役立ちます。後者の場合、オブジェクトを取得するときに、そのプロパティ内に保持されている値を正しく読み込む必要があります。実際のドキュメントと一緒に型情報を保存するメカニズム。

これを実現するために、MappingMongoConverter は DefaultMongoTypeMapper を主な実装として持つ MongoTypeMapper 抽象化を使用します。デフォルトの動作では、完全修飾クラス名がドキュメント内の _class に保存されます。型ヒントは、トップレベルのドキュメントだけでなく、すべての値 (複合型および宣言されたプロパティ型のサブ型の場合) に対しても書き込まれます。次の例 (最後に JSON 表現が付いています) は、マッピングがどのように機能するかを示しています。

例 1: 型マッピング
class Sample {
  Contact value;
}

abstract class Contact { … }

class Person extends Contact { … }

Sample sample = new Sample();
sample.value = new Person();

mongoTemplate.save(sample);

{
  "value" : { "_class" : "com.acme.Person" },
  "_class" : "com.acme.Sample"
}

Spring Data MongoDB は、実際のルートクラスおよびネストされた型 (複雑で Contact のサブ型であるため) の最後のフィールドとして型情報を格納します。そのため、現在 mongoTemplate.findAll(Object.class, "sample") を使用している場合は、格納されているドキュメントが Sample インスタンス。value プロパティが実際には Person であることもわかります。

型マッピングのカスタマイズ

Java クラス名全体を型情報として記述するのを避け、キーを使用したい場合は、エンティティクラスで @TypeAlias アノテーションを使用できます。マッピングをさらにカスタマイズする必要がある場合は、TypeInformationMapper インターフェースを参照してください。そのインターフェースのインスタンスは DefaultMongoTypeMapper で構成でき、さらに MappingMongoConverter で構成できます。次の例は、エンティティの型 エイリアスを定義する方法を示しています。

例 2: エンティティの型エイリアスの定義
@TypeAlias("pers")
class Person {

}

結果のドキュメントには、_class フィールドの値として pers が含まれることに注意してください。

型エイリアスは、マッピングコンテキストが実際の型を認識している場合にのみ機能します。必要なエンティティメタデータは、最初の保存時に決定されるか、構成の初期エンティティセットを介して提供される必要があります。デフォルトでは、構成クラスは基本パッケージをスキャンして潜在的な候補を探します。

@Configuration
class AppConfig extends AbstractMongoClientConfiguration {

  @Override
  protected Set<Class<?>> getInitialEntitySet() {
    return Collections.singleton(Person.class);
  }

  // ...
}

カスタム型マッピングの構成

次の例は、MappingMongoConverter でカスタム MongoTypeMapper を構成する方法を示しています。

class CustomMongoTypeMapper extends DefaultMongoTypeMapper {
  //implement custom type mapping here
}
例 3: カスタム MongoTypeMapper の構成
Java
@Configuration
class SampleMongoConfiguration extends AbstractMongoClientConfiguration {

  @Override
  protected String getDatabaseName() {
    return "database";
  }

  @Bean
  @Override
  public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory,
			MongoCustomConversions customConversions, MongoMappingContext mappingContext) {
    MappingMongoConverter mmc = super.mappingMongoConverter();
    mmc.setTypeMapper(customTypeMapper());
    return mmc;
  }

  @Bean
  public MongoTypeMapper customTypeMapper() {
    return new CustomMongoTypeMapper();
  }
}
XML
<mongo:mapping-converter type-mapper-ref="customMongoTypeMapper"/>

<bean name="customMongoTypeMapper" class="com.acme.CustomMongoTypeMapper"/>

前述の例は AbstractMongoClientConfiguration クラスを継承し、カスタム MongoTypeMapper を構成した MappingMongoConverter の Bean 定義をオーバーライドすることに注意してください。