sql >> データベース >  >> NoSQL >> MongoDB

SpringDataの紹介MongoDB

    1。概要

    この記事は、 SpringDataMongoDBの簡単で実用的な紹介です。

    MongoTemplateの両方を使用して基本を確認します MongoRepository 、各操作を説明するための実用的な例を示します。


    さらに読む:

    MongoDBでの地理空間サポート

    MongoDBを使用して地理空間データを保存、インデックス作成、検索する方法をご覧ください続きを読む→

    組み込みのMongoDBを使用したSpringBoot統合テスト

    Flapdoodleの組み込みMongoDBソリューションをSpringBootと一緒に使用して、MongoDB統合テストをスムーズに実行する方法を学びます。続きを読む→

    2。 MongoTemplate およびMongoRepository

    MongoTemplate Springの標準テンプレートパターンに従い、基盤となる永続化エンジンにすぐに使用できる基本的なAPIを提供します。

    リポジトリ Spring Data中心のアプローチに従い、すべてのSpring Dataプロジェクトでよく知られているアクセスパターンに基づいて、より柔軟で複雑なAPI操作が付属しています。

    どちらの場合も、依存関係を定義することから始める必要があります—たとえば、 pom.xml 、Mavenを使用:

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>3.0.3.RELEASE</version>
    </dependency>

    ライブラリの新しいバージョンがリリースされているかどうかを確認するには、ここでリリースを追跡します。

    3。 MongoTemplateの構成

    3.1。 XML構成

    Mongoテンプレートの単純なXML構成から始めましょう:

    <mongo:mongo-client id="mongoClient" host="localhost" />
    <mongo:db-factory id="mongoDbFactory" dbname="test" mongo-client-ref="mongoClient" />

    まず、Mongoインスタンスの作成を担当するファクトリBeanを定義する必要があります。

    次に、テンプレートBeanを実際に定義(および構成)する必要があります。

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
        <constructor-arg ref="mongoDbFactory"/> 
    </bean>

    そして最後に、 MongoExceptionsを変換するポストプロセッサを定義する必要があります。 @Repositoryにスローされます 注釈付きクラス:

    <bean class=
      "org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

    3.2。 Java構成

    ここで、MongoDB構成の基本クラスを拡張してJava構成を使用して同様の構成を作成しましょう AbstractMongoConfiguration

    @Configuration
    public class MongoConfig extends AbstractMongoClientConfiguration {
     
        @Override
        protected String getDatabaseName() {
            return "test";
        }
     
        @Override
        public MongoClient mongoClient() {
            ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
            MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
                .applyConnectionString(connectionString)
                .build();
            
            return MongoClients.create(mongoClientSettings);
        }
     
        @Override
        public Collection getMappingBasePackages() {
            return Collections.singleton("com.baeldung");
        }
    }

    MongoTemplateを定義する必要がないことに注意してください AbstractMongoClientConfiguration ですでに定義されているため、以前の構成のBean 。

    AbstractMongoClientConfiguration を拡張せずに、構成を最初から使用することもできます。 :

    @Configuration
    public class SimpleMongoConfig {
     
        @Bean
        public MongoClient mongo() {
            ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test");
            MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
              .applyConnectionString(connectionString)
              .build();
            
            return MongoClients.create(mongoClientSettings);
        }
    
        @Bean
        public MongoTemplate mongoTemplate() throws Exception {
            return new MongoTemplate(mongo(), "test");
        }
    }

    4。 MongoRepositoryの構成

    4.1。 XML構成

    カスタムリポジトリを利用するには( MongoRepositoryを拡張します )、セクション3.1から構成を続行する必要があります。リポジトリを設定します:

    <mongo:repositories 
      base-package="com.baeldung.repository" mongo-template-ref="mongoTemplate"/>
    

    4.2。 Java構成

    同様に、セクション3.2ですでに作成した構成に基づいて構築します。ミックスに新しい注釈を追加します:

    @EnableMongoRepositories(basePackages = "com.baeldung.repository")
    

    4.3。リポジトリを作成する

    構成後、リポジトリを作成する必要があります—既存の MongoRepositoryを拡張します インターフェイス:

    public interface UserRepository extends MongoRepository<User, String> {
        // 
    }

    これで、この UserRepositoryを自動配線できます。 MongoRepositoryの操作を使用します またはカスタム操作を追加します。

    5。 MongoTemplateの使用

    5.1。挿入

    挿入操作と空のデータベースから始めましょう:

    {
    }

    ここで、新しいユーザーを挿入すると:

    User user = new User();
    user.setName("Jon");
    mongoTemplate.insert(user, "user");

    データベースは次のようになります:

    {
        "_id" : ObjectId("55b4fda5830b550a8c2ca25a"),
        "_class" : "com.baeldung.model.User",
        "name" : "Jon"
    }

    5.2。 保存–挿入

    保存 操作には保存または更新のセマンティクスがあります。IDが存在する場合は更新を実行し、存在しない場合は挿入を実行します。

    最初のセマンティックである挿入を見てみましょう。

    データベースの初期状態は次のとおりです

    {
    }

    保存したとき 新規ユーザー:

    User user = new User();
    user.setName("Albert"); 
    mongoTemplate.save(user, "user");

    エンティティはデータベースに挿入されます:

    {
        "_id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
        "_class" : "com.baeldung.model.User",
        "name" : "Albert"
    }

    次に、同じ操作を見ていきます—保存 —更新セマンティクスを使用します。

    5.3。 保存–更新

    保存を見てみましょう 更新セマンティクスを使用して、既存のエンティティを操作します:

    {
        "_id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
        "_class" : "com.baeldung.model.User",
        "name" : "Jack"
    }

    保存するとき 既存のユーザーの場合は、更新します:

    user = mongoTemplate.findOne(
      Query.query(Criteria.where("name").is("Jack")), User.class);
    user.setName("Jim");
    mongoTemplate.save(user, "user");

    データベースは次のようになります:

    {
        "_id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
        "_class" : "com.baeldung.model.User",
        "name" : "Jim"
    }

    この特定の例では、保存していることがわかります。 updateのセマンティクスを使用します 与えられた_idのオブジェクトを使用するため 。

    5.4。 UpdateFirst

    updateFirst クエリに一致する最初のドキュメントを更新します。

    データベースの初期状態から始めましょう:

    [
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Alex"
        },
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614c"),
            "_class" : "com.baeldung.model.User",
            "name" : "Alex"
        }
    ]

    updateFirstを実行すると :

    Query query = new Query();
    query.addCriteria(Criteria.where("name").is("Alex"));
    Update update = new Update();
    update.set("name", "James");
    mongoTemplate.updateFirst(query, update, User.class);

    最初のエントリのみが更新されます:

    [
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "James"
        },
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614c"),
            "_class" : "com.baeldung.model.User",
            "name" : "Alex"
        }
    ]

    5.5。 UpdateMulti

    UpdateMulti 指定されたクエリに一致するすべてのドキュメントを更新します。

    まず、 updateMultiを実行する前のデータベースの状態を次に示します。 :

    [
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Eugen"
        },
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614c"),
            "_class" : "com.baeldung.model.User",
            "name" : "Eugen"
        }
    ]
    

    それでは、 updateMultiを実行してみましょう。 操作:

    Query query = new Query();
    query.addCriteria(Criteria.where("name").is("Eugen"));
    Update update = new Update();
    update.set("name", "Victor");
    mongoTemplate.updateMulti(query, update, User.class);

    既存の両方のオブジェクトがデータベースで更新されます:

    [
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Victor"
        },
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614c"),
            "_class" : "com.baeldung.model.User",
            "name" : "Victor"
        }
    ]

    5.6。 FindAndModify

    この操作はupdateMultiのように機能します 、ただし、変更前のオブジェクトを返します。

    まず、これは findAndModifyを呼び出す前のデータベースの状態です。 :

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Markus"
    }

    実際のオペコードを見てみましょう:

    Query query = new Query();
    query.addCriteria(Criteria.where("name").is("Markus"));
    Update update = new Update();
    update.set("name", "Nick");
    User user = mongoTemplate.findAndModify(query, update, User.class);

    返されたユーザーオブジェクト データベースの初期状態と同じ値です。

    ただし、これはデータベースの新しい状態です:

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Nick"
    }

    5.7。 アップサート

    アップサート 検索と変更、その他の作成セマンティクスで動作します :ドキュメントが一致する場合は更新するか、クエリと更新オブジェクトを組み合わせて新しいドキュメントを作成します。

    データベースの初期状態から始めましょう:

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Markus"
    }

    それでは、 upsertを実行してみましょう。 :

    Query query = new Query();
    query.addCriteria(Criteria.where("name").is("Markus"));
    Update update = new Update();
    update.set("name", "Nick");
    mongoTemplate.upsert(query, update, User.class);

    操作後のデータベースの状態は次のとおりです。

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Nick"
    }

    5.8。 削除

    remove を呼び出す前に、データベースの状態を確認します。 :

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Benn"
    }

    removeを実行してみましょう :

    mongoTemplate.remove(user, "user");

    結果は期待どおりになります:

    {
    }

    6。 MongoRepositoryの使用

    6.1。 挿入

    まず、 insert を実行する前に、データベースの状態を確認します。 :

    {
    }

    次に、新しいユーザーを挿入します:

    User user = new User();
    user.setName("Jon");
    userRepository.insert(user);
    

    そして、これがデータベースの最終状態です:

    {
        "_id" : ObjectId("55b4fda5830b550a8c2ca25a"),
        "_class" : "com.baeldung.model.User",
        "name" : "Jon"
    }

    操作が挿入と同じように機能することに注意してください MongoTemplateで API。

    6.2。 保存挿入

    同様に、保存 保存と同じように機能します MongoTemplateでの操作 API。

    まず、挿入セマンティクスを見てみましょう。 操作の。

    データベースの初期状態は次のとおりです。

    {
    }

    次に、保存を実行します 操作:

    User user = new User();
    user.setName("Aaron");
    userRepository.save(user);

    これにより、ユーザーがデータベースに追加されます:

    {
        "_id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
        "_class" : "com.baeldung.model.User",
        "name" : "Aaron"
    }

    保存方法にもう一度注意してください 挿入で動作します 新しいオブジェクトを挿入しているため、セマンティクス。

    6.3。 保存更新

    同じ操作を更新セマンティクスで見てみましょう。

    まず、新しい保存を実行する前のデータベースの状態を次に示します。 :

    {
        "_id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
        "_class" : "com.baeldung.model.User",
        "name" : "Jack"81*6
    }

    次に、操作を実行します:

    user = mongoTemplate.findOne(
      Query.query(Criteria.where("name").is("Jack")), User.class);
    user.setName("Jim");
    userRepository.save(user);

    最後に、データベースの状態は次のとおりです。

    {
        "_id" : ObjectId("55b52bb7830b8c9b544b6ad5"),
        "_class" : "com.baeldung.model.User",
        "name" : "Jim"
    }

    保存方法にもう一度注意してください updateで動作します 既存のオブジェクトを使用しているため、セマンティクス。

    6.4。 削除

    deleteを呼び出す前のデータベースの状態は次のとおりです。 :

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Benn"
    }

    deleteを実行してみましょう :

    userRepository.delete(user);
    

    そして、これが私たちの結果です:

    {
    }

    6.5。 FindOne

    次に、これは findOne時のデータベースの状態です。 と呼ばれる:

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Chris"
    }

    findOneを実行してみましょう :

    userRepository.findOne(user.getId())
    

    そして、結果は既存のデータを返します:

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Chris"
    }

    6.6。 存在する

    呼び出す前のデータベースの状態exists

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Harris"
    }

    それでは、 excistsを実行してみましょう 、もちろん trueを返します :

    boolean isExists = userRepository.exists(user.getId());

    6.7。 FindAll 並べ替え

    findAllを呼び出す前のデータベースの状態 :

    [
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Brendan"
        },
        {
            "_id" : ObjectId("67b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Adam"
        }
    ]

    findAllを実行してみましょう 並べ替え

    List<User> users = userRepository.findAll(Sort.by(Sort.Direction.ASC, "name"));

    結果は名前の昇順で並べ替えられます

    [
        {
            "_id" : ObjectId("67b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Adam"
        },
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Brendan"
        }
    ]

    6.8。 FindAll ページング可能

    findAllを呼び出す前のデータベースの状態 :

    [
        {
            "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Brendan"
        },
        {
            "_id" : ObjectId("67b5ffa5511fee0e45ed614b"),
            "_class" : "com.baeldung.model.User",
            "name" : "Adam"
        }
    ]

    findAllを実行してみましょう ページネーションリクエストあり:

    Pageable pageableRequest = PageRequest.of(0, 1);
    Page<User> page = userRepository.findAll(pageableRequest);
    List<User> users = pages.getContent();

    結果のユーザー リストは1人のユーザーのみになります:

    {
        "_id" : ObjectId("55b5ffa5511fee0e45ed614b"),
        "_class" : "com.baeldung.model.User",
        "name" : "Brendan"
    }

    7。注釈

    最後に、SpringDataがこれらのAPI操作を駆動するために使用する簡単なアノテーションについても見ていきましょう。

    フィールドレベル@Id アノテーションは、 long を含む、あらゆるタイプを装飾できます。 および文字列

    @Id
    private String id;

    @Idの値が フィールドはnullではなく、そのままデータベースに保存されます。それ以外の場合、コンバーターは ObjectIdを格納することを想定します。 データベース内( ObjectId 文字列 またはBigInteger 仕事)。

    次に@Documentを見ていきます :

    @Document
    public class User {
        //
    }

    このアノテーションは、単にクラスをドメインオブジェクトとしてマークします 使用するコレクションの名前を選択できるようにするとともに、データベースに永続化する必要があります。


    1. 何を選択すればよいですか:MongoDB / Cassandra / Redis / CouchDB?

    2. RDBToolsはRedisLabsに買収されました!

    3. タグキャッシュのようなもので、Redisを使用してそれらを提案するためにそれをクエリします

    4. Redis-メモリ使用量の監視