1. 概要

このチュートリアルでは、Spring DataMongoDBの@DBRefアノテーションを見ていきます。 このアノテーションを使用してMongoDBドキュメントを接続します。 さらに、MongoDBデータベース参照のタイプを確認し、それらも比較します。

2. MongoDBマニュアルデータベースリファレンス

最初に説明するタイプは、手動リファレンスと呼ばれます。 MongoDBでは、すべてのドキュメントにidフィールドが必要です。 したがって、それを使用してドキュメントを接続することができます。

手動参照を使用する場合、参照されたドキュメントの_idを別のドキュメントに保存します。 

後で、最初のコレクションからデータをクエリするときに、2番目のクエリを開始して、参照されているドキュメントをフェッチできます。

3. Spring Data MongoDB @DBRefアノテーション

DBRef は、参照されるドキュメントの _id も含まれているという意味で、手動参照に似ています。 ただし、参照されたドキュメントのコレクションが$ refフィールドに含まれ、オプションでそのデータベースも$dbフィールドに含まれます。

手動参照に対するこれの利点は、参照しているコレクションが明確になることです。

4. アプリケーションのセットアップ

4.1. 依存

まず、SpringBootでMongoDBを使用するために必要な依存関係を追加する必要があります。

spring-boot-starter-data-mongodbpom.xmlに追加しましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

4.2. 構成

ここで、application.propertiesファイルに次の構成を追加して接続を設定します。

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=person_database

アプリケーションを実行して、データベースに接続できるかどうかをテストしてみましょう。 ログに次のようなメッセージが表示されます。

Opened connection [connectionId{localValue:2, serverValue:37}] to localhost:27017

これは、アプリケーションがMongoDBに正常に接続できることを意味します。

4.3. コレクション

MongoDBでは、 コレクションは、個々のドキュメントを保存します。 これらは、リレーショナルデータベースのテーブルに相当します。

この例では、 Person Dog 、およびCatの3つの異なるデータ型を使用します。 人とペットをつなぎます。

いくつかのデータを使用してデータベースにコレクションを作成しましょう。 これにはMongoExpress を使用できますが、他のツールでも同様に機能します。

まず、 person_database という名前のデータベースを作成し、その中にDogCat。という名前の2つのコレクションを作成します。それぞれに1つのドキュメントを挿入します。 簡単にするために、両方に1つのプロパティ(ペットの名前)のみがあります。

このドキュメントをDogコレクションに挿入しましょう。

{
    _id: ObjectID("622112d71f9dac417b84227d"), 
    name: "Max"
}

次に、このドキュメントをに挿入しましょう ネコ コレクション:

{
    _id: ObjectID("622112781f9dac417b84227b"),
    name: "Loki"
}

それでは、を作成しましょう 収集してドキュメントを挿入します。

{
    _id: ObjectId(),
    name: "Bob",
    pets: [
        {
          "$ref": "Cat",
          "$id": "622112781f9dac417b84227b",
          "$db": ""
        },    
        {
          "$ref": "Dog",
          "$id": "622112d71f9dac417b84227d",
          "$db": ""
        }
    ]
}

ペットを一列に並べてご用意しております。 配列のアイテムは、DBRefとして使用できるように特定の形式に従う必要があります。 $refプロパティでコレクションの名前を指定する必要があります。 この場合は、CatDogです。 次に、参照されたドキュメントのIDを含めます。 最後に、別のデータベースのコレクションを参照する場合は、オプションで $dbプロパティにデータベース名を含めることができます。

5. @DBRefアノテーションの使用

リレーショナルデータベースを操作する場合と同様に、以前に作成したコレクションをJavaクラスにマップできます。

簡単にするために、Dogデータ型とCatデータ型に別々のクラスを作成しません。 代わりに、IDと名前を含むPetクラスを使用します。

public class Pet {
    private String id;
    private String name;

    @Override 
    public String toString() {
        return "Pet [id=" + id + ", name=" + name + "]";
    }

    // standard getters and setters
}

次に、を作成します クラスとへの関連付けを含める ペット 経由クラス @DBRef:

@Document(collection = "Person")
public class Person {

    @Id
    private String id;
    
    private String name;

    @DBRef
    private List<Pet> pets;

    @Override 
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", pets=" + pets + "]";
    }

    // standard getters and setters
}

次に、データをクエリできるようにするための単純なリポジトリを作成しましょう。

public interface PersonRepository extends MongoRepository<Person, String> {}

アプリケーションの起動時にMongoDBクエリを実行するApplicationRunnerを作成して、すべてをテストします。 run()メソッドをオーバーライドし、ログステートメントを配置してPersonコレクションの内容を確認しましょう。

@Override
public void run(ApplicationArguments args) throws Exception {
    logger.info("{}", personRepository.findAll());
}

これにより、エンティティクラスの toString()メソッドがオーバーライドされたため、これと同様のログ出力が生成されます。

com.baeldung.mongodb.dbref.DbRefTester : [Person [id=62249c5c7ffe83c50ad12700, name=Bob, pets=[Pet [id=622112781f9dac417b84227b, name=Loki], Pet [id=622112d71f9dac417b84227d, name=Max]]]]

これは、さまざまなコレクションからドキュメントを正常に読み取って結合したことを意味します。

5.1. 別のデータベースを参照する

@DBRefアノテーションは2つのパラメーターを受け入れます。 それらの1つは、 db パラメーターであり、他のデータベースのドキュメントを参照するために使用できます。

これはオプションです。つまり、この値を指定しない場合、アプリケーションは同じデータベースで参照されているドキュメントを検索します。

この場合、 CatまたはDogpet_database、という名前の別のデータベースにある場合、注釈を次のように変更する必要があります: @ DBRef(db =“ pet_database”)

5.2. 遅延読み込み

注釈によって受け入れられる他のパラメーターは、lazyと呼ばれます。 これはboolean値であり、参照されるドキュメントを遅延ロードする必要があるかどうかを決定します。

デフォルトでは、 false です。これは、メインエンティティにクエリを実行するときに参照が熱心に読み込まれることを意味します。 この機能をオンにすると、参照されたドキュメントは、最初にアクセスされるまでロードされません。

6. 結論

この記事では、MongoDBのマニュアルリファレンスをSpringDataMongoDBと比較しました @DBRef。 3つのコレクションを作成し、それらをこのアノテーションで接続しました。 MongoRepositoryを使用してこれらのコレクションをクエリするSpringBootアプリケーションを作成し、関連ドキュメントを表示しました。

いつものように、例のソースコードはGitHubから入手できます。