프로그래밍-Web/MongoDB(22)
-
[정리] Mongoose (1) 스키마와 모델
1) Schema와 type의 정의 - 모든 스키마는 MongoDB의 콜렉션과 매핑되어 있다. 각 property의 자료형을 지정하여 Schema 객체를 생성한다. 이때 실제로 type과 schema에서 정의하는 type은 다르다. schema에 key를 type으로 설정하고 자료형을 정의한다면, 얘는 API가 스키마에 쉽게 접근하기 위한 방법이 될 뿐이지, 실제로 DB에 type으로 들어간다는 보장은 없다. - 각 type에 대한 다양한 옵션들이 존재한다. (mongoosejs.com/docs/schematypes.html 참고하자) - 그 후 API에서 직접 사용할 모델 인스턴스를 만들어 내보낸다. 실제 API들은 모델 인스턴스(예시코드의 경우 CBSModel)에 접근하여 find 등의 쿼리로직을 수..
2021.02.08 -
[이슈] Upsert 옵션 사용시 주의점 - E11000 duplicate key error
1. Upsert 동작 원리 및 문제 발생 상황 upsert는 filter에 정의된 Document를 확인한 후, filter에 해당하는 document가 존재하는 경우 update, 존재하지 않는 경우 insert를 수행하게 하는 옵션이다 Upsert의 수행과정을 나눠보면 조건확인 -> 쿼리실행의 순서로 진행된다. 이렇게 Step을 나누는 이유는 upsert가 모든 절차에 대해 Atomic하지 않고, 각 step마다 atomic하기 때문이다. 따라서 Upsert 옵션이 true인 여러개의 쿼리를 순차적으로 실행하는 경우, 1번 원소의 쿼리실행이 끝나지 않았음에도 2번 원소에 대한 쿼리가 실행될 수 있다. 예시 코드는 itemList에 대한 find를 수행한 후, 조건에 따라 itemList의 value..
2021.02.05 -
[이슈] 몽고DB 드라이버 비동기 처리 이슈
몽고DB 드라이버의 메소드는 기본적으로 thenable 객체를 리턴한다 (이는 Promise를 사용할 수 없다, then으로 잡히기 때문에 thenable이라고 함) 따라서 이렇게 비동기적으로 실행되는 방식이기 때문에 1. exce() 메소드를 통해 실행 시점을 정해주든가 2. 콜백 처리를 하든가 3. await 처리를 하든가 해야한다. 그렇게 하지 않으면 쿼리 날리는 횟수가 자기 맘대로다 첫번째 처럼 날리면 안된다는 이야기. (sol에서는 exec() 메소드를 사용했지만, 기타 create( ) , remove( ), save( ) 같은 컬렉션 조작 메소드를 사용해도 비동기 로직이 처리된다. 단, 쿼리만 정의하고 로직을 태우면 안된다는 것) 왜냐하면 내부 로직이 비동기로 돌아가므로, 리턴을 받기도 전에..
2021.01.14 -
[자료정리] push vs addToset, 그리고 배열의 update조작
둘 다 배열에 원소를 추가하는 목적으로 사용되는데 push는 중복체크를 하지 않고, addToset은 중복체크를 한다. 둘 다 배열을 조작하는 command고 체크 여부의 차이만 있으므로, 예시는 push만 들어본다. 0) set의 사용 기본적인 update 구문에서 set은 '수정'을 의미한다. 이를 설정하지 않으면 name 필터로 찾은 도큐먼트 전체가 hp:30으로 변경되니 주의 1) 기본적인 push 사용 보통 push할 element가 정해진 경우 $push:{element:value}형태로 입력하면 된다 filter로 걸러낸 document에 대해 element, value를 입력한다 물론 addToSet은 중복체크 여부에만 차이가 있고 용법은 같다 2) element를 여러개 넣는 경우 $ea..
2021.01.11