MongoDB에서 부분 데이터 삭제하기
MongoDB에서는 조건에 맞는 문서뿐 아니라 특정 순번 이후의 문서들만 골라서 삭제할 수도 있습니다. 이 글에서는 find(), skip(), toArray(), 그리고 map() 함수를 조합하여 컬렉션의 일부 데이터(부분 데이터)를 삭제하는 방법을 단계별로 살펴보겠습니다.
1단계: 테스트용 컬렉션 만들기
먼저 insertOne() 메서드를 사용해 'deleteDemo' 컬렉션에 이름 데이터가 담긴 문서 10개를 삽입합니다.
> db.deleteDemo.insertOne({"Name":"John"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd550492cba06f46efe9f06") }
> db.deleteDemo.insertOne({"Name":"Carol"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd5504d2cba06f46efe9f07") }
> db.deleteDemo.insertOne({"Name":"Sam"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd550512cba06f46efe9f08") }
> db.deleteDemo.insertOne({"Name":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd5505d2cba06f46efe9f09") }
> db.deleteDemo.insertOne({"Name":"Robert"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd550682cba06f46efe9f0a") }
> db.deleteDemo.insertOne({"Name":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd5506f2cba06f46efe9f0b") }
> db.deleteDemo.insertOne({"Name":"Mike"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd550752cba06f46efe9f0c") }
> db.deleteDemo.insertOne({"Name":"Bob"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd5507a2cba06f46efe9f0d") }
> db.deleteDemo.insertOne({"Name":"James"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd550822cba06f46efe9f0e") }
> db.deleteDemo.insertOne({"Name":"Jace"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd550862cba06f46efe9f0f") }2단계: 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.deleteDemo.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5cd550492cba06f46efe9f06"), "Name" : "John" }
{ "_id" : ObjectId("5cd5504d2cba06f46efe9f07"), "Name" : "Carol" }
{ "_id" : ObjectId("5cd550512cba06f46efe9f08"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd5505d2cba06f46efe9f09"), "Name" : "David" }
{ "_id" : ObjectId("5cd550682cba06f46efe9f0a"), "Name" : "Robert" }
{ "_id" : ObjectId("5cd5506f2cba06f46efe9f0b"), "Name" : "Chris" }
{ "_id" : ObjectId("5cd550752cba06f46efe9f0c"), "Name" : "Mike" }
{ "_id" : ObjectId("5cd5507a2cba06f46efe9f0d"), "Name" : "Bob" }
{ "_id" : ObjectId("5cd550822cba06f46efe9f0e"), "Name" : "James" }
{ "_id" : ObjectId("5cd550862cba06f46efe9f0f"), "Name" : "Jace" }3단계: 부분 데이터 삭제 쿼리 실행하기
이제 5번째 레코드 이후의 모든 문서를 삭제하는 쿼리를 실행합니다. 핵심 원리는 다음과 같습니다.
skip(5): 앞의 5개 문서를 건너뜁니다.toArray().map(): 남은 문서들의_id값만 배열로 추출합니다.$in연산자: 추출한_id목록을 삭제 조건으로 지정합니다.
> var value = db.deleteDemo.find({}, {_id : 1}).skip(5).toArray().map(function(documentValue) { return documentValue._id; });
> db.deleteDemo.remove({_id: {$in:value}});
WriteResult({ "nRemoved" : 5 })실행 결과 nRemoved : 5가 출력된 것을 보면, 6번째 문서부터 마지막 문서까지 총 5개가 성공적으로 삭제되었음을 알 수 있습니다.
4단계: 삭제 결과 확인하기
다시 find() 메서드로 컬렉션을 조회하면 처음 5개 문서만 남아 있는 것을 확인할 수 있습니다.
> db.deleteDemo.find();
{ "_id" : ObjectId("5cd550492cba06f46efe9f06"), "Name" : "John" }
{ "_id" : ObjectId("5cd5504d2cba06f46efe9f07"), "Name" : "Carol" }
{ "_id" : ObjectId("5cd550512cba06f46efe9f08"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd5505d2cba06f46efe9f09"), "Name" : "David" }
{ "_id" : ObjectId("5cd550682cba06f46efe9f0a"), "Name" : "Robert" }참고: 최신 버전에서는 deleteMany() 사용 권장
MongoDB 3.2 이상 버전에서는 remove() 메서드가 사용 중단(deprecated) 권고 대상이므로, 동일한 작업을 deleteMany()로 수행하는 것이 좋습니다.
db.deleteDemo.deleteMany({_id: {$in:value}});이처럼 skip()과 map()을 활용하면 원하는 위치 이후의 문서만 손쉽게 선택하여 삭제할 수 있으며, 대량의 테스트 데이터를 정리할 때 특히 유용합니다.