MongoDB에서 컬렉션의 모든 항목을 제거할 때는 크게 두 가지 방법이 있습니다. 바로 drop()과 remove()입니다. 두 메서드는 비슷해 보이지만 동작 방식에 중요한 차이가 있습니다.
drop() 메서드는 컬렉션 자체와 관련된 모든 정보(문서, 인덱스 등)를 완전히 삭제하며 속도가 매우 빠릅니다. 반면 remove() 메서드는 컬렉션 내의 모든 레코드만 삭제하고, 컬렉션과 인덱스는 그대로 유지합니다.
아래 예제를 통해 두 메서드의 차이를 직접 확인해 보겠습니다.
drop() 메서드 사용하기
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.dropWorkingDemo.createIndex({"FirstName":1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.dropWorkingDemo.insertOne({"FirstName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cdd8742bf3115999ed511e9")
}find() 메서드를 사용하여 컬렉션의 모든 문서를 조회하는 쿼리는 다음과 같습니다.
> db.dropWorkingDemo.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5cdd8742bf3115999ed511e9"), "FirstName" : "John" }이제 drop() 메서드를 사용해 보겠습니다.
> db.dropWorkingDemo.drop();
실행 결과는 다음과 같습니다.
True
drop() 메서드 실행 후 인덱스가 남아 있는지 확인해 보겠습니다.
> db.dropWorkingDemo.getIndexes();
실행 결과는 다음과 같습니다.
[ ]
결과가 빈 배열로 반환되었으므로, 인덱스가 더 이상 존재하지 않음을 알 수 있습니다. 즉, drop()은 컬렉션 자체를 통째로 제거하기 때문에 생성했던 인덱스까지 함께 사라집니다.
remove() 메서드 사용하기
이번에는 remove() 메서드를 살펴보겠습니다. 마찬가지로 먼저 문서가 포함된 컬렉션을 생성합니다.
> db.removeDemo.createIndex({"FirstName":1});
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.removeDemo.insertOne({"FirstName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cdd8868bf3115999ed511ea")
}find() 메서드로 컬렉션의 모든 문서를 조회합니다.
> db.removeDemo.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cdd8868bf3115999ed511ea"), "FirstName" : "John" }이제 remove() 메서드를 사용하여 모든 문서를 삭제합니다.
> db.removeDemo.remove({});
WriteResult({ "nRemoved" : 1 })remove() 메서드 실행 후 인덱스가 여전히 존재하는지 확인해 보겠습니다.
> db.removeDemo.getIndexes();
실행 결과는 다음과 같습니다.
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.removeDemo"
},
{
"v" : 2,
"key" : {
"FirstName" : 1
},
"name" : "FirstName_1",
"ns" : "test.removeDemo"
}
]결과를 보면 _id 인덱스와 FirstName 인덱스가 그대로 남아 있는 것을 확인할 수 있습니다. 즉, remove()는 문서만 삭제할 뿐 컬렉션 구조와 인덱스는 유지됩니다.
정리 및 참고 사항
두 메서드의 차이를 요약하면 다음과 같습니다.
- drop(): 컬렉션 전체와 인덱스를 모두 삭제하며, 처리 속도가 빠릅니다. 컬렉션을 완전히 없애고 싶을 때 적합합니다.
- remove(): 문서만 삭제하고 컬렉션과 인덱스는 유지합니다. 컬렉션 구조와 인덱스를 그대로 두고 데이터만 비우고 싶을 때 적합합니다.
참고로, MongoDB 3.2 이후 버전에서는 remove() 메서드가 deprecated(사용 중단 권고)되었습니다. 최신 버전에서는 대신 deleteMany({}) 또는 deleteOne() 메서드를 사용하는 것이 좋습니다. 예를 들어 db.collection.deleteMany({})를 사용하면 remove({})와 동일하게 모든 문서를 삭제하면서 컬렉션과 인덱스를 유지할 수 있습니다.