오랜만에 MongoDB로 다시 돌아왔습니다. 만약 NoSQL이 익숙하지 않다면 간단한 설명을 읽어보세요. 오늘은 데이터 삭제입니다.
테스트 데이터 준비
우선 더미 데이터를 만들어 보겠습니다. 200만 건입니다.
> for ( var inx=0; inx<2000000; inx++ ) {
... db.jeeg_remove.insert({"korea": "seoul", "sarc": inx, "jeeg": 1+inx-2})
... }
>
실제 환경에서 대량 데이터를 넣거나 삭제할 때는 테스트용 데이터베이스에서 먼저 실행해 보는 것이 좋습니다. 특히 삭제 명령은 되돌리기 어렵기 때문에, 운영 데이터라면 백업 여부와 대상 조건을 반드시 확인해야 합니다.
remove()로 문서 삭제
먼저 remove()를 이용하여 삭제를 해보겠습니다.
> db.jeeg_remove.remove(); >
그리고 remove()를 실행한 시점의 로그를 한 번 보겠습니다.
Mon May 25 01:26:23.194 [conn1] remove test.jeeg_remove ndeleted:2000000 keyUpdates:0 numYields: 115 locks(micros) w:24787789 13647ms
시간이 적지 않게 걸렸네요. 로그의 ndeleted:2000000을 보면 200만 건이 삭제되었고, 마지막의 13647ms를 통해 삭제 작업에 걸린 시간을 확인할 수 있습니다.
findOne()으로 삭제 여부까지 확인해 봅니다.
> db.jeeg_remove.findOne(); null >
참고로 이 예제는 당시 사용하던 MongoDB 셸 문법을 기준으로 한 것입니다. 최신 MongoDB 환경에서는 전체 문서를 삭제할 때 db.jeeg_remove.deleteMany({})처럼 명시적으로 조건을 전달하는 방식을 더 자주 사용합니다. 다만 의미는 같습니다. 컬렉션은 남겨 두고 그 안의 문서만 삭제하는 방식입니다.
drop()으로 컬렉션 삭제
이번에는 drop()을 이용합니다.
화면은 생략하지만, 매우 빠릅니다. remove()가 컬렉션 안의 문서를 하나씩 삭제하는 방식이라면, drop()은 컬렉션 자체를 제거합니다. 따라서 컬렉션에 있던 인덱스도 함께 사라집니다.
즉, 데이터를 모두 비우되 컬렉션과 인덱스 구조를 유지하고 싶다면 remove() 또는 deleteMany({}) 계열을 사용하고, 컬렉션 자체가 더 이상 필요 없다면 drop()을 사용하는 식으로 구분하면 됩니다.