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

MongoDBを使用したSpringDataReactive Repositories

    1。はじめに

    このチュートリアルでは、MongoDBを使用したSpring DataReactiveRepositoriesを介したReactiveProgrammingを使用してデータベース操作を構成および実装する方法を説明します。

    ReactiveCrudの基本的な使用法について説明します。 リポジトリ、 ReactiveMongoRepository ReactiveMongoTemplate。も同様です。

    これらの実装はリアクティブプログラミングを使用していますが、それはこのチュートリアルの主な焦点ではありません。

    2。環境

    Reactive MongoDBを使用するには、依存関係をpom.xml。に追加する必要があります。

    テスト用に組み込みのMongoDBも追加します:

    <dependencies>
        // ...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
        </dependency>
        <dependency>
            <groupId>de.flapdoodle.embed</groupId>
            <artifactId>de.flapdoodle.embed.mongo</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    3。構成

    リアクティブサポートを有効にするには、 @EnableReactiveMongoRepositoriesを使用する必要があります いくつかのインフラストラクチャのセットアップと一緒に:

    @EnableReactiveMongoRepositories
    public class MongoReactiveApplication
      extends AbstractReactiveMongoConfiguration {
    
        @Bean
        public MongoClient mongoClient() {
            return MongoClients.create();
        }
    
        @Override
        protected String getDatabaseName() {
            return "reactive";
        }
    }

    スタンドアロンのMongoDBインストールを使用している場合は、上記が必要になることに注意してください。ただし、この例ではMongoDBが埋め込まれたSpring Bootを使用しているため、上記の構成は必要ありません。

    4。 ドキュメントの作成

    以下の例では、アカウントを作成しましょう。 クラスを作成し、 @Documentで注釈を付けます データベース操作で使用するには:

    @Document
    public class Account {
     
        @Id
        private String id;
        private String owner;
        private Double value;
     
        // getters and setters
    }

    5。リアクティブリポジトリの使用

    リポジトリプログラミングモデルについてはすでによく知っており、CRUDメソッドはすでに定義されており、他の一般的なものもサポートされています。

    これでリアクティブモデルを使用して、結果とパラメーターをリアクティブな方法で処理することを除いて、同じメソッドと仕様のセットを取得します。

    5.1。 ReactiveCrudRepository

    このリポジトリは、ブロッキング CrudRepositoryと同じように使用できます。 :

    @Repository
    public interface AccountCrudRepository 
      extends ReactiveCrudRepository<Account, String> {
     
        Flux<Account> findAllByValue(String value);
        Mono<Account> findFirstByOwner(Mono<String> owner);
    }

    プレーン(文字列)のようなさまざまなタイプの引数を渡すことができます )、ラップ(オプションストリーム )、またはリアクティブ( Mono フラックス findFirstByOwner()で確認できるように メソッド。

    5.2。 ReactiveMongoRepository

    ReactiveMongoRepositoryもあります ReactiveCrudRepositoryから継承するインターフェイス いくつかの新しいクエリメソッドを追加します:

    @Repository
    public interface AccountReactiveRepository 
      extends ReactiveMongoRepository<Account, String> { }

    ReactiveMongoRepositoryの使用 、例でクエリできます:

    Flux<Account> accountFlux = repository
      .findAll(Example.of(new Account(null, "owner", null)));

    その結果、すべてのアカウントを取得します 渡された例と同じです。

    リポジトリを作成すると、実装する必要のないデータベース操作を実行するためのメソッドがすでに定義されています。

    Mono<Account> accountMono 
      = repository.save(new Account(null, "owner", 12.3));
    Mono<Account> accountMono2 = repository
      .findById("123456");

    5.3。 RxJava2CrudRepository

    RxJava2CrudRepository ReactiveCrudRepositoryと同じ動作をします ただし、 RxJavaの結果とパラメータタイプを使用します :

    @Repository
    public interface AccountRxJavaRepository 
      extends RxJava2CrudRepository<Account, String> {
     
        Observable<Account> findAllByValue(Double value);
        Single<Account> findFirstByOwner(Single<String> owner);
    }

    5.4。基本操作のテスト

    リポジトリメソッドをテストするために、テストサブスクライバーを使用します:

    @Test
    public void givenValue_whenFindAllByValue_thenFindAccount() {
        repository.save(new Account(null, "Bill", 12.3)).block();
        Flux<Account> accountFlux = repository.findAllByValue(12.3);
    
        StepVerifier
          .create(accountFlux)
          .assertNext(account -> {
              assertEquals("Bill", account.getOwner());
              assertEquals(Double.valueOf(12.3) , account.getValue());
              assertNotNull(account.getId());
          })
          .expectComplete()
          .verify();
    }
    
    @Test
    public void givenOwner_whenFindFirstByOwner_thenFindAccount() {
        repository.save(new Account(null, "Bill", 12.3)).block();
        Mono<Account> accountMono = repository
          .findFirstByOwner(Mono.just("Bill"));
    
        StepVerifier
          .create(accountMono)
          .assertNext(account -> {
              assertEquals("Bill", account.getOwner());
              assertEquals(Double.valueOf(12.3) , account.getValue());
              assertNotNull(account.getId());
          })
          .expectComplete()
          .verify();
    }
    
    @Test
    public void givenAccount_whenSave_thenSaveAccount() {
        Mono<Account> accountMono = repository.save(new Account(null, "Bill", 12.3));
    
        StepVerifier
          .create(accountMono)
          .assertNext(account -> assertNotNull(account.getId()))
          .expectComplete()
          .verify();
    }

    6。 ReactiveMongoTemplate

    リポジトリアプローチに加えて、 ReactiveMongoTemplate

    まず、 ReactiveMongoTemplateを登録する必要があります Beanとして:

    @Configuration
    public class ReactiveMongoConfig {
     
        @Autowired
        MongoClient mongoClient;
    
        @Bean
        public ReactiveMongoTemplate reactiveMongoTemplate() {
            return new ReactiveMongoTemplate(mongoClient, "test");
        }
    }

    次に、このBeanをサービスに注入して、データベース操作を実行できます。

    @Service
    public class AccountTemplateOperations {
     
        @Autowired
        ReactiveMongoTemplate template;
    
        public Mono<Account> findById(String id) {
            return template.findById(id, Account.class);
        }
     
        public Flux<Account> findAll() {
            return template.findAll(Account.class);
        } 
        public Mono<Account> save(Mono<Account> account) {
            return template.save(account);
        }
    }

    ReactiveMongoTemplate また、私たちが持っているドメインに関係のないいくつかのメソッドがあります。それらはドキュメントで確認できます。


    1. Spring Boot+Redis-奇妙なキーを生成する

    2. MongoDB $ strcasecmp

    3. MongoDBとDynamoDB:知っておくべきこと

    4. MongoDBを使用した単体テスト