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

[Mongoose] Update관련, 차이점

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

updateOne() vs findOneAndUpdate() vs replaceOne() vs updateOne()

 

Update관련

Mongoose: Model.update(): 지원중지, Model.updateOne(), Model.updateMany(), Model.replaceOne(), Model.findOneAndReplace(), Model.findOneAndUpdate(), Model.findByIdAndUpdate()

 

Model.update(): 지원중지

2023.02.24 - [데이터베이스/MongoDB] - [Mongoose] Deprecation Warnings(remove(), update(), count())

 

[Mongoose] Deprecation Warnings(remove(), update(), count())

Deprecation Warnings (지원중단 경고)목록_(remove(), update(), count()) https://www.npmjs.com/package/mongodb mongodb The official MongoDB driver for Node.js. Latest version: 5.1.0, last published: 8 hours ago. Start using mongodb in your project by

kfdd6630.tistory.com

 

Model.updateOne()

1. 다중 또는 덮어쓰기 옵션을 지원하지 않는다.

2. MongoDB는 다중 옵션 값에 관계없이 필터와 일치하는 첫 번째 문서만 수정한다.

 

Model.updateMany()

1. MongoDB가 다중 옵션의 값에 관계없이 필터와 일치하는 모든 문서를 수정한다는 점을 제외하면 update()와 동일하다.

 * updateMany는 update 미들웨어를 실행하지 않는다. post('updateMany')를 사용한다.

 

Model.findOneAndUpdate()

1. 쿼리와 일치하는 문서를 찾고, update 인수에 따라 수정하고, 옵션을 전달하고, 찾은 문서(있는 경우)를 콜백에 반환한다.

2. 콜백이 전달되면 쿼리가 실행되고 그렇지 않으면 쿼리 개체가 반환된다.

 

Model.findByIdAndUpdate()

1. 문서의 _id 필드로 mongodb의 findAndModify 수정명령을 실행한다.

2. findByIdAndUpdate(id, ...)는 findOneAndUpdate({ _id: id }, ...)와 동일하다.

3. 일치하는 문서를 찾고, update 인수에 따라 수정하고, 옵션을 전달하고, 찾은 문서(있는 경우)를 콜백에 반환한다.

4. 콜백이 전달되면 쿼리가 실행되고 그렇지 않으면 쿼리 개체가 반환된다.

 

Model.replaceOne()

1. MongoDB가 기존 문서를 지정된 문서로 대체한다는 점을 제외하면 update()와 동일하다.

2. $set과 같은 원자 연산자가 없다.

 

Model.findOneAndReplace()

1. 일치하는 문서를 찾아 제공된 문서로 바꾸고 반환된 문서를 콜백에 전달한다. 콜백이 전달되면 쿼리를 실행한다.

 

 

updateOne() vs findOneAndUpdate()

Model.updateOne()

하나의 문서를 찾아 업데이트하고 updateOne 문서를 반환하지 않는다. 

const res = await Book.updateOne({ name: '홍길동' }, { title: '홍길동전' });
res.matchedCount; // 일치하는 문서 수
res.modifiedCount; // 수정된 문서 수
res.acknowledged; // 모든것이 잘 동작했는지에 대한 부울타입의 값
res.upsertedId; // null 또는 업데이트해야 하는 문서를 포함하는 ID
res.upsertedCount; // 업서트해야 하는 문서 수를 나타내는 숫자, 0 또는 1

Model.findOneAndUpdate()

하나의 문서를 찾아 업데이트하고 반환 값으로 문서를 반환한다.

 - 기본적으로 원본 문서(수정 전 문서)를 반환한다.

 - options.new = true인 경우 원본이 아닌 수정된 문서를 반환한다.

 - 찾는 문서가 없을 경우 find하기 위한 query개체를 다시 반환한다.

 

공통점: 하나의 문서를 찾아 업데이트하는 것은 동일하다.

차이점

1. 여러 사례에 대한 반환 값(return 되는 값)이 다르다.

2. updateOne()의 사용 사례는 문서가 필요하지 않고 약간의 시간과 자원(대역폭)을 절약하려는 경우이다.

 

 

replaceOne() vs updateOne()

1. replaceOne()을 사용하면 전체 문서만 바꿀 수 있지만 updateOne()은 필드를 수정할 수 있다.

2. replaceOne()이 전체 문서를 대체하므로, 새 문서에 포함되지 않은 이전 문서의 필드는 손실된다.

3. updateOne()을 사용하면 이전 문서의 필드를 잃지 않고 새 필드를 추가할 수 있다.

4. updateOne()에서 $set과 같은 원자 연산자를 사용하는 대신 전체 문서를 덮어쓰려면 replaceOne()을 사용한다.

5. findOneAndUpdate()에서 options.overwrite = true를 사용하는 대신 findOneAndReplace()를 사용한다.

반응형

댓글