005 Mongo Operations

ReactiveMongoOperations #

ReactiveMongoOperations #

  • ReactiveFluentMongoOperations를 상속
  • ReactiveFluentMongoOperations는 여러 Operations를 상속
    • ReactiveFindOperation: find query와 관련된 메서드 제공
    • ReactiveInsertOperation: insert query와 관련된 메서드 제공
    • ReactiveUpdateOperation: update query와 관련된 메서드 제공
    • ReactiveRemoveOperation: delete query와 관련된 메서드 제공
    • ReactiveAggregationOperation: aggregation query와 관련된 메서드 제공
    • ReactiveChangeStreamOperation: watch query와 관련된 메서드 제공 img.png

ReactiveFindOperation #

  • ReactiveFindOperation의 query 부터 시작
  • TerminatingFind의 count, exists, first, one, all, tail 등으로 종료
  • query -> inCollection -> as -> matching -> 최종
  • query -> inCollection -> matching -> 최종
  • query -> as -> matching -> 최종
  • query -> matching -> 최종
  • query -> 최종 img_1.png

ReactiveFindOperation #

  • inCollection
    • query를 실행할 collection 이름을 전달
    • 제공되지 않을 경우
      • domain Type의 class 이름 통해 collection 이름 획득
      • @Document 어노테이션 통해 collection 이름 획득
  • as
    • Entity를 전부 mapping하지 않고 특정 필드만 mapping 하고 싶은 경우
      • Entity의 일부 property만 담고 있는 subclass 또는 interface를 넘겨서 projection
      • projection이 제공되지 않는다면 Entity에 모든 필드를 mapping img_2.png
  • matching
    • query의 filter에 해당
      • Query를 전달하여 filter에 들어갈 내용을 설정
      • matching을 생략하면 collection 전체에 대한 요청을 보내는 것과 동일
  • 최종
    • 마지막으로 count, exists, first, one, all, tail 등의 연산을 선택
      • count: 조건에 맞는 document의 개수 반환
      • exists: 조건에 맞는 document 존재 여부 반환
      • first: 조건에 맞는 첫 번째 document 반환
      • one: 조건에 맞는 하나의 document 반환. 하나가 넘으면 exception
      • all: 조건에 맞는 모든 document 반환
      • tail: cursor를 이용하여 조건에 해당하는 document를 지속적으로 수신 img_3.png

ReactiveFindOperation 실행 #

  • MongoClient를 이용하여 ReactiveMongoTemplate을 생성
  • Query와 Criteria를 이용해서 query 생성
  • PersonNameOnlyDocument class를 이용해서 id와 name만 projection img_4.png img_5.png img_6.png

ReactiveInsertOperation #

  • ReactiveInsertOperation의 insert 부터 시작하여 TerminatingInsert의 one, all로 종료
    • insert -> into -> (one, all)
    • insert -> (one, all) img_7.png

ReactiveInsertOperation #

  • one
    • insert query에 이용할 entity 하나를 전달
      • 주어진 entity를 Document로 변환하고 insert
      • 결과를 Mono로 반환
  • all
    • bulk insert 지원
      • 주어진 entity Collection -> Document Collection으로 변환하고 insert
      • 결과를 flux로 반환 img_8.png

ReactiveInsertOperation 실행 #

  • inCollection을 통해서 insert할 collection 명시
  • entity를 생성하여 all에 전달 img_9.png img_10.png

ReactiveUpdateOperation #

  • ReactiveUpdateOperation의 update 부터 시작
  • update, findAndModify, findAndReplace 지원 img_11.png

findAndReplace #

  • Document를 찾고 다른 Document로 대체
  • 쿼리를 실행하고 그 결과를 Mono로 반환
  • replaceWith : 대상을 찾게되었을때 대체할 객체를 제공
  • withOptions : findAndReplace에 대한 옵션 제공
    • returnNew : true -> 대체된 document를 반환, false(default) -> 기존 document를 반환
    • upsert : true -> 조건에 만족하는 document가 없는 경우 insert, false -> 존재하는 경우에만
  • as : 값을 대체한 후 그 결과를 전부 mapping하지 않고 특정 필드만 mapping 하고 싶은 경우 img_12.png

findAndModify #

  • 값을 찾아서 update 하고 그 결과를 Mono로 변환
  • withOptions : findAndModify에 대한 옵션 제공
    • returnNew : true -> 대체된 document를 반환, false(default) -> 기존 document를 반환
    • upsert : true -> 조건에 만족하는 document가 없는 경우 insert, false -> 존재하는 경우에만
    • remove : true -> update 대신 delete 수행 img_13.png

update #

  • apply : update를 수행
    • insert와 다르게 Entity가 아닌 Update 객체 전달
    • Update 객체의 update, fromDocument 등을 통해서 생성
    • set, unset, setOrInsert, inc, push, pop, pull, rename, currentDate, multiply 등의 연산 지원\
  • all : 조건을 만족하는 모든 document에 대해 update
  • first : 조건을 만족하는 첫 document에 대해서 update
  • upsert: 조건을 만족하는 document가 있다면 update하고 없다면 새로 생성 img_14.png

findAndReplace 실행 #

  • inCollection을 통해서 update할 collection 명시
  • matching으로 update 영향을 받는 document 제한
  • returnNew 옵션 제공 img_15.png img_16.png

findAndModify 실행 #

  • inCollection을 통해서 update할 collection 명시
  • matching으로 update 영향을 받는 document 제한
  • Update 객체로 여러 필드 수정 img_17.png img_18.png

update 실행 #

  • inCollection을 통해서 update할 collection 명시
  • 조건을 만족하는 document가 없게 만듬
  • Update 객체로 여러 필드 수정
  • upsert로 새로 추가
    • upsert: 조건을 만족하는 document가 있다면 update하고 없다면 새로 생성 img_19.png img_20.png

ReactiveRemoveOperation #

  • ReactiveRemoveOperation의 remove 부터 시작하여 TerminatingRemove의 all, findAndRemove으로 종료
  • remove -> inCollection -> matching -> 실행
  • remove -> inCollection -> 실행
  • remove -> matching -> 실행
  • remove -> 실행 img_21.png

ReactiveAggregationOperation #

  • ReactiveAggregationOperation의 aggregateAndReturn 부터 시작하여 TerminatingAggregationOperation의 all로 종료
  • aggregateAndReturn -> inCollection -> by -> all
  • aggregateAndReturn -> by -> all img_22.png

ReactiveChangeStreamOperation #

  • ReactiveChangeStreamOperation의 changeStream 부터 시작하여 TerminatingChangeStream의 listen로 종료
  • withOptions: changeStream과 관련된 옵션 제공
  • filter: stream을 listen하는 동안 filter할 대상
  • as: stream의 결과로 mapping할 Class 제공
  • resumeAt: 주어진 Token부터 listen 재개
  • resumeAfter: 주어진 Token 이후부터 listen 재개
  • startAfter: 주어진 Token부터 listen 새로 시작 img_23.png
mongoTemplate.changeStream(ChatDocument.class)
        .listen()
        .doOnNext(item -> {
            ChatDocument target = item.getBody();
            OperationType operationType = item.getOperationType();
    
            log.info("target: {}", target);
            log.info("type: {}", operationType);
    
            if (target != null && operationType == OperationType.INSERT) {
                String from = target.getFrom();
                String to = target.getTo();
                String message = target.getMessage();
    
                doSend(from, to, message);
            }
        })
        .subscribe();

ReactiveMongoOperations #

  • ReactiveFluentMongoOperations에서 제공하는 조합 방식 대신
  • 다양한 쿼리를 수행하는 단축 메소드 제공 img_24.png

  1. 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_