2021. 2. 8. 18:33ㆍ프로그래밍-Web/MongoDB
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 등의 쿼리로직을 수행한다.
2) Mongoose가 리턴하는 객체
- 각 스키마는 Property에 대한 자료형을 정의해야 한다.
- POJO(Plain Old Javascript Object) : 단순 자바스크립트 객체. 그러나 Mongoose 쿼리를 통해 조회된 객체는 POJO가 아닌 Virtuals, getter, setter를 포함한 다양한 메소드를 담고 있다. Mongoose Document객체이기 때문이다. 해당 객체의 _doc로 접근해야 원하는 POJO를 받아올 수 있다.
- 순수하게 POJO만 받아내기 위해, 리턴받은 객체에 toObject()나 lean() 메소드를 사용할 수 있다.
- 만들어진 스키마는 model메소드를 통해 model객체로 변화시켜야 사용이 가능하다.
- mongoose에 대해 스키마에서 접근할때는 자동으로 ObjectID를 생성해주지만, model객체로 새로운 객체를 만들어 접근한다면 _id가 자동으로 만들어지지 않는다. 따라서 Document가 아니므로 save와 같은 메소드도 사용이 불가능하므로, id를 만들어주어야 한다.
- model로 instance를 생성하면 해당 instance는 document객체가 된다. 이때 this객체의 바인딩이 필요하므로 arrow function은 사용하지 않도록 한다.
3) statics, methods, vitural
- 모델객체에는 두가지 방법, statics과 method로 메소드를 만들 수 있다. 이때 statics는 모델 자체를, methods는 인스턴스를 가리킨다.
- 첫번째 방법은 statics이다. 여기서 this는 모델 자체를 가리키므로, static으로 선언한 메소드 안에 쿼리를 짜주고, 실제 사용시 statics의 메소드를 그대로 불러오면 된다.
- 두번째 방법은 mehods이다. 실제로 쿼리로직은 api에 존재하고, 자주쓰는 인스턴스에 대해서 메소드를 설정하는 것이다.
- 쿼리헬퍼와 인덱스는 추후 포스팅
- vitual 메소드는 MongoDB에는 없지만 가공 후 사용해야 하는 API property들을 스키마에 정의해두는 것이다. 예시의 경우 fullName이라는 속성은 DB에 original 존재하는 property는 아니다. 그러나 virtual을 이용하여 name의 first와 last 를 붙여 fullName이라는 것을 가져오도록 만들었다.
- 실제로 axl이라는 모델 인스턴스에 fullName으로 접근하게 되면, 우리가 원하는 속성을 바로 얻어낼 수 있다.
- 각각 getter와 setter를 설정할 수 있다.
4) 모델
- Mongoose를 사용한다는 것은, DB를 보고 Schema를 정의한 후, 그로부터 Model이라는 Contructor를 만들어 내어, 그 Instance에 접근한다는 것이다.
- Mongoose의 Schema 메소드로 schema를 만들어내고, model 메소드로 model를 만들어낸다.
- 모델의 instance는 Document이다. 따라서 save로 내용 생성이 가능하다.
'프로그래밍-Web > MongoDB' 카테고리의 다른 글
[aggregate] 기본적인 aggregate 사용 방식 & 배열이 존재하는 경우 (0) | 2021.02.10 |
---|---|
[정리] Mongoose (2) 도큐먼트와 쿼리 (0) | 2021.02.09 |
[이슈] Upsert 옵션 사용시 주의점 - E11000 duplicate key error (0) | 2021.02.05 |
[이슈] 몽고DB 드라이버 비동기 처리 이슈 (0) | 2021.01.14 |
[자료정리] push vs addToset, 그리고 배열의 update조작 (0) | 2021.01.11 |