본문 바로가기
데이터베이스/MongoDB

[Mongoose] Create관련, 차이점

by minhyeok.lee 2023. 2. 27.
반응형

Model.prototype.save(), Model.create(), Model.insertMany(), Model.bulkWrite(), Model.bulkSave

 

Create관련

Mongoose : Model.prototype.save(), Model.create(), Model.insertMany(), Model.bulkWrite(), Model.bulkSave

 

1. Model.prototype.save()

document.isNew가 true인 경우 데이터베이스에 새 문서를 삽입하여 이 문서를 저장한다.

isNew가 false인 경우 수정된 경로만 포함하는 updateOne 작업을 보낸다.

 

2. Model.create()

하나 이상의 문서를 데이터베이스에 저장하기 위한 바로 가기이다.

MyModel.create(docs)는 docs의 모든 문서에 대해 new MyModel(doc).save()를 수행한다.

 

예시코드)

// 하나의 새로운 Model의 문서 삽입
await Model.create({ name: '홍길동' });

// 여러개의 새로운 `Character` 문서 삽입
await Model.create([{ name: '장보고' }, { name: '임꺽정' }]);

// 트랜잭션 내에 새 문자를 만듭니다. 반드시해야 한다.
// 원한다면 배열을 'create☆'의 첫 번째 매개 변수로 전달한다.
// 옵션을 지정한다.
await Model.create([{ name: '홍길동' }], { session });

 

3. Model.insertMany()

문서 배열의 유효성을 검사하고 모두 유효한 경우 MongoDB에 삽입하는 바로 가기이다.

이 함수는 각 문서에 대해 하나가 아니라 서버에 하나의 작업만 보내기 때문에 .create()보다 빠르다.

Mongoose는 insertMany를 MongoDB로 보내기 전에 항상 각 문서의 유효성을 검사한다.

따라서 하나의 문서에 유효성 검사 오류가 있는 경우 order 옵션을 false로 설정하지 않는 한 문서가 저장되지 않는다.

 

 

4. Model.bulkWrite()

여러 insertOne, updateOne, updateMany, replaceOne, deleteOne 또는 deleteMany 작업을 하나의 명령으로 MongoDB 서버에 보낸다.

이것은 여러 독립 작업(예: create()를 사용하는 경우)을 보내는 것보다 빠르다.

왜냐하면 bulkWrite()를 사용하면 MongoDB로의 왕복이 한 번만 있기 때문이다.

Model.bulkWrite([
  {
    insertOne: {
      document: {
        name: '홍길동',
        title: '홍길동전'
      }
    }
  },
  {
    updateOne: {
      filter: { name: '홍길동' },
      update: { title: '의적 홍길동' }
    }
  },
  {
    deleteOne: {
      filter: { name: '홍길동' }
    }
  }
]).then(res => {
 console.log(res.insertedCount, res.modifiedCount, res.deletedCount);
});

MongoDB 드라이버를 직접 사용했다면 `update: { $set: { title: ... } }`을 수행해야 하지만 mongoose가 $set을 추가한다.

 

Mongoose는 제공하는 모든 작업에 대해 캐스팅을 수행한다.

이 함수는 save()나 update()와 같은 미들웨어를 트리거하지 않는다.

모든 문서에 대해 save() 미들웨어를 트리거해야 하는 경우 대신 create()를 사용한다.

 

5. Model.bulkSave

문서 배열을 가져오고 변경 사항을 가져오고 문서가 새 문서인지 또는 변경 사항이 있는지 여부에 따라 데이터베이스에 문서를 삽입/업데이트한다.

 

 

차이점

save()를 트리거하는 경우: Model.prototype.save(), Model.create()

save()를 트리거하지 않는 경우: Model.insertMany(), Model.bulkWrite(), Model.bulkSave

 

1. 일반적인 경우: Model.create() 사용한다.

2. 많은 문서를 넣을때: Model.insertMany() 사용한다.

3. 한 번에 다양한 작업(주로 문서 하나 삽입, 수정, 삭제)를 할때 Model.bulkWrite() 사용한다.

4. 한 번에 다양한 작업(주로 문서 하나 삽입, 수정, 삭제)를 save형식으로 사용하고자 하면 Model.bulkSave 사용한다.

반응형

댓글