프로그래밍-Web/MongoDB(22)
-
[aggregate] lookup에서 pipeline사용
상황 - Join과 유사한 방법으로 처리된 두 개의 컬렉션 데이터가 필요한데, 여러가지 조건이 존재하는 경우 - 예컨데 'A컬렉션의 name이라는 데이터가 포함된 description'이라는 데이터를 가지고 있는 B 컬렉션 데이터가 필요한 경우--- 설명이 장황하니 아래 실제 예시를 보자 위의 데이터는 work라는 도큐먼트이고 얘는 zone이라는 도큐먼트이다 zone도큐먼트의 name이 포함된 work의 name을 찾고싶은 상황이다. 그러나 이는 같은 project에 속해야하므로 projectId도 같은 데이터들만 반환해야 한다. 이렇게 복합적인 Join은 pipeline을 이용해 풀어낼 수 있다. 결과 코드는 다음과 같다. 이전 포스팅처럼 Lookup을 이용하지만, foreign과 local field..
2021.02.23 -
[정리] Mongoose Index 설정 이슈 및 기본세팅
무분별하게 다량의 데이터에 인덱싱을 하는 경우, CUD에 큰 문제가 생길 수 있다. 기본적으로 대부분의 인덱스는, 인덱싱된 데이터를 기준으로 Binary tree 탐색을 수행한다. 이로 인해 필요한 영역에 대해서만 데이터 스캔이 가능하다. 예컨데 다음과 같은 데이터가 있다고 해보자. 해당 데이터 중 '이름'에 인덱싱 처리를 하면 아래와 같은 테이블이 생길것이다. 만약 이름에 '송종국'이라는 데이터를 가지고 있는 Document에 대한 질의를 수행한다면 5번 도큐먼트만 메모리로 끌어올리는 Single block I/O가 일어난다 반면 '토트넘'으로 찾는다면, 여기에는 인덱싱 처리가 되어있지 않으므로 모든 Document를 끌어올려 질의를 수행하는 Multi block I/O가 일어난다 이렇게 적절한 인덱싱..
2021.02.22 -
[aggregate] lookup으로 필요한 부분 JOIN하여 계산하기
aggregate를 하나의 컬렉션에서 복잡한 연산 처리하는 목적으로도 사용하지만, 보통 nosql에 존재하지 않는 JOIN을 유사하게 따라하기 위해 사용한다. 아래 예시는 aggregate로 다른 collection 데이터를 가져와 JOIN후 결과를 리턴하는 로직이다. 해당 로직은 CBSModel이라는 콜렉션에서 동작하고, JOIN을 위해 cbs라는 콜렉션에 접근한다 (사실 두개는 같은 콜렉션이지만, from에 위치한 collection이 같고다름은 중요하지 않다) CBSModel 컬렉션에는 childIdList라는 필드가 존재한다. 해당 필드는 id를 배열로 가지고 있으며, 각 id의 value는 cbs 콜렉션의 필드에 해당된다. 헷갈리니 CBSMdoel은 원컬렉션, cbs는 목적컬렉션으로 지칭하겠다...
2021.02.10 -
[이슈] lookup의 from절
예컨데 lookup의 from절을 설정한다고 해보자. 기존 서버코드에서 따로 모델객체 이름을 설정했다고 하더라도, from은 컬렉션 이름으로 기입하여야 한다. 예시코드의 경우에도 cbs라는 컬렉션에 대해 다양한 이유로 이름을 설정했다고 하더라도, 실제 물리적 DB 스키마의 컬렉션이름으로 써줘야 command가 도달한다.
2021.02.10 -
[aggregate] 기본적인 aggregate 사용 방식 & 배열이 존재하는 경우
aggregate는 복잡한 연산이 필요한 read에 대한 내용이다. find만으로는 데이터 가공에 한계가 있기 때문에, aggregate를 활용하여 복잡한 연산을 수행한다. 가장 흔하게 사용하는 방식은 다음과 같다. match command로 조건에 맞는 document를 filtering해주고, group을 사용하여 필요한 연산을 진행하는 것이다. 이 과정에서 배열이 argument로 존재한다면 까다로워진다. 예시코드의 경우도 itemList가 배열로 존재하는 경우이다. 이 경우에는 unwind 를 통해 배열을 iterate하며 원소 하나당 POJO 객체를 만들어준다 배열을 풀어놓으면 dot command로 접근이 가능하다. 해당 로직은 nested한 document 배열의 cost값들을 읽어 quan..
2021.02.10 -
[정리] Mongoose (2) 도큐먼트와 쿼리
1) Document - 몽구스는 기본단위로 Document를 가진다. 이는 모델의 인스턴스이다. - Model 역시 기본적으로 Document 클래스에 해당된다. 몽구스의 특정 메소드로 쿼리를 처리하고 난 후에도 Document 자료형이 반환된다. 2) save( ) - save의 결과는 promise를 리턴한다. - save는 middleware와 validation을 실행할 수 있지만, findOneAndUpdate나 update구문은 불가능하다. - save( )는 미들웨어다. findOneAndUpdate등의 쿼리는 미들웨어를 실행시키지 않는다. 그래서 save처럼 비동기처리가 불가능하다. 3) SubDocuments - Document 객체의 하나의 컬럼으로 다시 객체를 갖는 경우 - Nest..
2021.02.09