[정리] Mongoose (2) 도큐먼트와 쿼리

2021. 2. 9. 11:54프로그래밍-Web/MongoDB

1) Document

 

- 몽구스는 기본단위로 Document를 가진다. 이는 모델의 인스턴스이다.

 

- Model 역시 기본적으로 Document 클래스에 해당된다. 몽구스의 특정 메소드로 쿼리를 처리하고 난 후에도 Document 자료형이 반환된다.

 

 

2) save( )

 

- save의 결과는 promise를 리턴한다. 

- save는 middleware와 validation을 실행할 수 있지만, findOneAndUpdate나 update구문은 불가능하다.

- save( )는 미들웨어다. findOneAndUpdate등의 쿼리는 미들웨어를 실행시키지 않는다. 그래서 save처럼 비동기처리가 불가능하다. 

 

3) SubDocuments

 

- Document 객체의 하나의 컬럼으로 다시 객체를 갖는 경우

 

 

- Nested path로 객체를 직접 설정하는 방식과 Subdocument를 설정하는 방식의 차이가 있다. 첫째로 Nested한 방식으로 생성한 스키마는 child 객체를 갖지만, subdocument는 갖지 않는다. 실제 Document를 overwrite 하는 경우에도 nested한 방식으로 생성된 스키마는 기존 내용을 건들지 않고 추가되지만, subdocument는 덮어쓴다.

 

 

4) Query

 

- 몽구스는 CRUD Operation을 제공하는데, 이 메소드를 사용하면 Query 객체를 리턴한다.

- 일반적으로 callback로직을 짜거나, .then( )을 활용하여 비동기처럼 처리한다. 그러나 이는 Promise가 아니다. Promise를 리턴하지 않으므로 쿼리가 여러번 실행될 가능성이 있다. 따라서 비동기 처리가 필요하다.

 

mongoosejs.com/docs/api.html#model-js

 

Mongoose v5.11.15: API docs

 

mongoosejs.com

- Operation종류에 따라 return되는 Query의 형태는 다르다, 

 

- Aggregate와의 차이: Aggregate는 반드시 필요한 경우에만 써라. 얘는 Document를 리턴하지 않고 무조건 POJO객체를 리턴한다.

- 배열 Qurey를 실행하면 별다른 command를 붙이지 않아도 암묵적으로 $in이 수행된다

 

- findOneAndUpdate: new옵션을 true로 설정하면 update 이후 document를 리턴해준다. 

- findOneAndUpdate는 index가 없는 upsert를 제외하곤 atomic 속성을 유지해준다. 예컨데 save만 사용하는 경우 atomic이 유지되지 않아 문제발생이 가능하지만, findOneAndUpdate는 그렇지 않다