MongoDB에서는 remove() 메서드를 활용하면 여러 조건을 동시에 만족하는 문서만 골라서 삭제할 수 있습니다. 이번 글에서는 샘플 컬렉션을 직접 만들어 보고, _id와 Name이라는 두 가지 조건을 함께 적용해 특정 문서를 삭제하는 과정을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 deleteDataDemo 컬렉션에 문서를 하나씩 삽입합니다.
> db.deleteDataDemo.insertOne({_id:1,"Name":"Larry"});
{ "acknowledged" : true, "insertedId" : 1 }
> db.deleteDataDemo.insertOne({_id:2,"Name":"Chris"});
{ "acknowledged" : true, "insertedId" : 2 }
> db.deleteDataDemo.insertOne({_id:3,"Name":"Robert"});
{ "acknowledged" : true, "insertedId" : 3 }
> db.deleteDataDemo.insertOne({_id:4,"Name":"David"});
{ "acknowledged" : true, "insertedId" : 4 }
> db.deleteDataDemo.insertOne({_id:5,"Name":"Carol"});
{ "acknowledged" : true, "insertedId" : 5 }
> db.deleteDataDemo.insertOne({_id:6,"Name":"Sam"});
{ "acknowledged" : true, "insertedId" : 6 }
2. 전체 문서 조회하기
find() 메서드에 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.deleteDataDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 1, "Name" : "Larry" }
{ "_id" : 2, "Name" : "Chris" }
{ "_id" : 3, "Name" : "Robert" }
{ "_id" : 4, "Name" : "David" }
{ "_id" : 5, "Name" : "Carol" }
{ "_id" : 6, "Name" : "Sam" }
현재 총 6개의 문서가 저장되어 있는 것을 확인할 수 있습니다.
3. 여러 조건으로 데이터 삭제하기
이제 여러 조건을 사용해 데이터를 삭제해 보겠습니다. 아래 예제에서는 _id가 4이면서 Name이 "David"인 문서, 즉 두 조건을 모두 만족하는 문서를 삭제합니다.
> db.deleteDataDemo.remove({'_id':4,'Name':"David"});
WriteResult({ "nRemoved" : 1 })
실행 결과로 nRemoved : 1이 반환되었으므로, 정확히 한 개의 문서가 삭제된 것입니다. 참고로 조건 객체에 나열된 필드들은 AND 논리로 결합되기 때문에, 두 조건을 모두 충족하는 문서만 삭제됩니다.
4. 삭제 결과 확인하기
다시 전체 문서를 조회해 삭제가 제대로 이루어졌는지 확인해 보겠습니다.
> db.deleteDataDemo.find().pretty();
출력 결과는 다음과 같습니다.
{ "_id" : 1, "Name" : "Larry" }
{ "_id" : 2, "Name" : "Chris" }
{ "_id" : 3, "Name" : "Robert" }
{ "_id" : 5, "Name" : "Carol" }
{ "_id" : 6, "Name" : "Sam" }
_id가 4였던 David의 문서가 사라지고 나머지 5개의 문서만 남아 있는 것을 확인할 수 있습니다.
참고: 최신 MongoDB 버전에서의 대안
remove() 메서드는 현재 deprecated(사용 중단 권고) 상태이므로, 최신 버전의 MongoDB에서는 상황에 맞는 아래 메서드를 사용하는 것이 좋습니다.
- deleteOne(): 조건에 일치하는 문서 중 첫 번째 문서 하나만 삭제
- deleteMany(): 조건에 일치하는 모든 문서를 삭제
예를 들어 위 예제와 동일한 작업은 다음과 같이 작성할 수 있습니다.
> db.deleteDataDemo.deleteOne({'_id':4,'Name':"David"});
이처럼 조건을 명확하게 지정하면 의도하지 않은 문서까지 삭제되는 실수를 방지할 수 있으며, 실무 환경에서는 삭제 전 find()로 대상 문서를 먼저 확인하는 습관을 들이는 것이 안전합니다.