Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB deleteOne() vs findOneAndDelete(): 차이점 완벽 비교

MongoDB deleteOne()과 findOneAndDelete()의 차이점

MongoDB에서 문서를 삭제할 때 사용하는 대표적인 두 가지 메서드가 바로 deleteOne()findOneAndDelete()입니다. 두 메서드 모두 컬렉션에서 단일 문서를 제거한다는 공통점이 있지만, 반환값정렬(sort) 옵션 지원 여부에서 중요한 차이가 있습니다.

핵심 차이점 요약

deleteOne(): 필터 조건에 일치하는 첫 번째 문서 하나를 컬렉션에서 삭제합니다. 실행 결과로는 삭제 성공 여부(acknowledged)와 삭제된 문서 수(deletedCount)만 반환되며, 삭제된 문서의 내용은 확인할 수 없습니다.

findOneAndDelete(): 필터와 정렬(sort) 기준에 따라 문서를 찾아 삭제한 후, 삭제된 문서 자체를 반환합니다. 따라서 어떤 문서가 삭제되었는지 즉시 확인해야 하는 경우에 유용합니다.

예제용 컬렉션 생성하기

실습을 위해 demo448이라는 컬렉션을 만들고 문서 세 개를 삽입해 보겠습니다.

> db.demo448.insertOne({"Name":"Chris","Age":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5e7a291cbbc41e36cc3caeca") }
> db.demo448.insertOne({"Name":"David","Age":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5e7a2926bbc41e36cc3caecb") }
> db.demo448.insertOne({"Name":"Bob","Age":22});
{ "acknowledged" : true, "insertedId" : ObjectId("5e7a2930bbc41e36cc3caecc") }

find() 메서드로 컬렉션의 모든 문서를 조회하면 다음과 같습니다.

> db.demo448.find();

출력 결과:

{ "_id" : ObjectId("5e7a291cbbc41e36cc3caeca"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e7a2926bbc41e36cc3caecb"), "Name" : "David", "Age" : 23 }
{ "_id" : ObjectId("5e7a2930bbc41e36cc3caecc"), "Name" : "Bob", "Age" : 22 }

deleteOne() 사용 예제

deleteOne()으로 특정 _id를 가진 문서를 삭제해 보겠습니다.

> db.demo448.deleteOne({_id:ObjectId("5e7a2926bbc41e36cc3caecb")});

실행 결과는 아래와 같이 삭제된 문서의 개수만 표시됩니다.

{ "acknowledged" : true, "deletedCount" : 1 }

다시 find()로 전체 문서를 조회하면 David 문서가 삭제된 것을 확인할 수 있습니다.

> db.demo448.find();

출력 결과:

{ "_id" : ObjectId("5e7a291cbbc41e36cc3caeca"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e7a2930bbc41e36cc3caecc"), "Name" : "Bob", "Age" : 22 }

findOneAndDelete() 사용 예제

이번에는 findOneAndDelete()로 Bob 문서를 삭제해 보겠습니다.

> db.demo448.findOneAndDelete({"_id":ObjectId("5e7a2930bbc41e36cc3caecc")});

deleteOne()과 달리, 삭제된 문서의 전체 내용이 그대로 반환됩니다.

{ "_id" : ObjectId("5e7a2930bbc41e36cc3caecc"), "Name" : "Bob", "Age" : 22 }

find()로 남은 문서를 확인하면 Chris 문서만 남아 있는 것을 볼 수 있습니다.

> db.demo448.find();

출력 결과:

{ "_id" : ObjectId("5e7a291cbbc41e36cc3caeca"), "Name" : "Chris", "Age" : 21 }

정리: 언제 어떤 메서드를 사용해야 할까?

삭제 결과를 로그로 남기거나, 삭제된 데이터를 애플리케이션에서 활용해야 한다면 findOneAndDelete()가 적합합니다. 반면 단순히 문서를 제거하기만 하면 되는 상황이라면 더 간결한 deleteOne()을 사용하는 것이 좋습니다. 또한 findOneAndDelete()는 sort 옵션을 지원하므로, 여러 문서가 조건에 일치할 때 정렬 기준에 따라 삭제할 문서를 지정할 수 있다는 점도 기억해 두세요.