ReactiveMongoOperations
#
ReactiveMongoOperations
#
- ReactiveFluentMongoOperations를 상속
- ReactiveFluentMongoOperations는 여러 Operations를 상속
- ReactiveFindOperation: find query와 관련된 메서드 제공
- ReactiveInsertOperation: insert query와 관련된 메서드 제공
- ReactiveUpdateOperation: update query와 관련된 메서드 제공
- ReactiveRemoveOperation: delete query와 관련된 메서드 제공
- ReactiveAggregationOperation: aggregation query와 관련된 메서드 제공
- ReactiveChangeStreamOperation: watch query와 관련된 메서드 제공
ReactiveFindOperation
#
- ReactiveFindOperation의 query 부터 시작
- TerminatingFind의 count, exists, first, one, all, tail 등으로 종료
- query -> inCollection -> as -> matching -> 최종
- query -> inCollection -> matching -> 최종
- query -> as -> matching -> 최종
- query -> matching -> 최종
- query -> 최종
ReactiveFindOperation
#
- inCollection
- query를 실행할 collection 이름을 전달
- 제공되지 않을 경우
- domain Type의 class 이름 통해 collection 이름 획득
- @Document 어노테이션 통해 collection 이름 획득
- as
- Entity를 전부 mapping하지 않고 특정 필드만 mapping 하고 싶은 경우
- Entity의 일부 property만 담고 있는 subclass 또는 interface를 넘겨서 projection
- projection이 제공되지 않는다면 Entity에 모든 필드를 mapping
- 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를 지속적으로 수신
ReactiveFindOperation 실행
#
- MongoClient를 이용하여 ReactiveMongoTemplate을 생성
- Query와 Criteria를 이용해서 query 생성
- PersonNameOnlyDocument class를 이용해서 id와 name만 projection
ReactiveInsertOperation
#
- ReactiveInsertOperation의 insert 부터 시작하여 TerminatingInsert의 one, all로 종료
- insert -> into -> (one, all)
- insert -> (one, all)
ReactiveInsertOperation
#
- one
- insert query에 이용할 entity 하나를 전달
- 주어진 entity를 Document로 변환하고 insert
- 결과를 Mono로 반환
- all
- bulk insert 지원
- 주어진 entity Collection -> Document Collection으로 변환하고 insert
- 결과를 flux로 반환
ReactiveInsertOperation 실행
#
- inCollection을 통해서 insert할 collection 명시
- entity를 생성하여 all에 전달
ReactiveUpdateOperation
#
- ReactiveUpdateOperation의 update 부터 시작
- update, findAndModify, findAndReplace 지원
findAndReplace
#
- Document를 찾고 다른 Document로 대체
- 쿼리를 실행하고 그 결과를 Mono로 반환
- replaceWith : 대상을 찾게되었을때 대체할 객체를 제공
- withOptions : findAndReplace에 대한 옵션 제공
- returnNew : true -> 대체된 document를 반환, false(default) -> 기존 document를 반환
- upsert : true -> 조건에 만족하는 document가 없는 경우 insert, false -> 존재하는 경우에만
- as : 값을 대체한 후 그 결과를 전부 mapping하지 않고 특정 필드만 mapping 하고 싶은 경우
findAndModify
#
- 값을 찾아서 update 하고 그 결과를 Mono로 변환
- withOptions : findAndModify에 대한 옵션 제공
- returnNew : true -> 대체된 document를 반환, false(default) -> 기존 document를 반환
- upsert : true -> 조건에 만족하는 document가 없는 경우 insert, false -> 존재하는 경우에만
- remove : true -> update 대신 delete 수행
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하고 없다면 새로 생성
findAndReplace 실행
#
- inCollection을 통해서 update할 collection 명시
- matching으로 update 영향을 받는 document 제한
- returnNew 옵션 제공
findAndModify 실행
#
- inCollection을 통해서 update할 collection 명시
- matching으로 update 영향을 받는 document 제한
- Update 객체로 여러 필드 수정
update 실행
#
- inCollection을 통해서 update할 collection 명시
- 조건을 만족하는 document가 없게 만듬
- Update 객체로 여러 필드 수정
- upsert로 새로 추가
- upsert: 조건을 만족하는 document가 있다면 update하고 없다면 새로 생성
ReactiveRemoveOperation
#
- ReactiveRemoveOperation의 remove 부터 시작하여 TerminatingRemove의 all, findAndRemove으로 종료
- remove -> inCollection -> matching -> 실행
- remove -> inCollection -> 실행
- remove -> matching -> 실행
- remove -> 실행
ReactiveAggregationOperation
#
- ReactiveAggregationOperation의 aggregateAndReturn 부터 시작하여 TerminatingAggregationOperation의 all로 종료
- aggregateAndReturn -> inCollection -> by -> all
- aggregateAndReturn -> by -> all
ReactiveChangeStreamOperation
#
- ReactiveChangeStreamOperation의 changeStream 부터 시작하여 TerminatingChangeStream의 listen로 종료
- withOptions: changeStream과 관련된 옵션 제공
- filter: stream을 listen하는 동안 filter할 대상
- as: stream의 결과로 mapping할 Class 제공
- resumeAt: 주어진 Token부터 listen 재개
- resumeAfter: 주어진 Token 이후부터 listen 재개
- startAfter: 주어진 Token부터 listen 새로 시작
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에서 제공하는 조합 방식 대신
- 다양한 쿼리를 수행하는 단축 메소드 제공