MongoDB에서 부분 데이터를 삭제하는 방법
MongoDB에서는 조건에 맞는 문서만 골라서 삭제할 수 있습니다. 핵심 아이디어는 삭제할 문서의 _id 값을 미리 변수에 추출해 두고, 이를 remove() 메서드의 조건으로 넘겨주는 것입니다. 아래 예제를 통해 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
insertOne() 메서드를 사용해 demo488 컬렉션에 이름 데이터를 담은 문서 7개를 순서대로 삽입합니다.
> db.demo488.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8351e0b0f3fa88e22790b2")
}
> db.demo488.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8351e8b0f3fa88e22790b3")
}
> db.demo488.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8351ebb0f3fa88e22790b4")
}
> db.demo488.insertOne({"Name":"Mike"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8351eeb0f3fa88e22790b5")
}
> db.demo488.insertOne({"Name":"Sam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e835202b0f3fa88e22790b6")
}
> db.demo488.insertOne({"Name":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e835207b0f3fa88e22790b7")
}
> db.demo488.insertOne({"Name":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e83520cb0f3fa88e22790b8")
}
2단계: find()로 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo488.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e8351e0b0f3fa88e22790b2"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8351e8b0f3fa88e22790b3"), "Name" : "David" }
{ "_id" : ObjectId("5e8351ebb0f3fa88e22790b4"), "Name" : "Bob" }
{ "_id" : ObjectId("5e8351eeb0f3fa88e22790b5"), "Name" : "Mike" }
{ "_id" : ObjectId("5e835202b0f3fa88e22790b6"), "Name" : "Sam" }
{ "_id" : ObjectId("5e835207b0f3fa88e22790b7"), "Name" : "John" }
{ "_id" : ObjectId("5e83520cb0f3fa88e22790b8"), "Name" : "Robert" }
3단계: 부분 데이터 삭제 쿼리 실행
다음은 앞의 4개 문서를 건너뛰고(skip(4)) 나머지 문서만 골라 삭제하는 쿼리입니다.
> var deleteData = db.demo488.find({}, {_id : 1}).skip(4).toArray().map(function(d) { return d._id; });
> db.demo488.remove({_id: {$in: deleteData}})
WriteResult({ "nRemoved" : 3 })
이 쿼리의 동작 방식을 하나씩 살펴보면 다음과 같습니다.
find({}, {_id : 1}): 모든 문서에서_id값만 가져옵니다.skip(4): 처음 4개 문서는 제외하고 그 이후의 문서만 선택합니다.toArray().map(...): 선택된 문서들의_id값을 배열로 변환해deleteData변수에 저장합니다.remove({_id: {$in: deleteData}}): 해당_id목록에 포함된 문서 3개(Sam, John, Robert)를 한 번에 삭제합니다.
4단계: 삭제 후 결과 확인
다시 find() 메서드로 컬렉션의 문서를 조회합니다.
> db.demo488.find();
실행 결과, 앞의 4개 문서만 남고 나머지 3개 문서가 성공적으로 삭제된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e8351e0b0f3fa88e22790b2"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8351e8b0f3fa88e22790b3"), "Name" : "David" }
{ "_id" : ObjectId("5e8351ebb0f3fa88e22790b4"), "Name" : "Bob" }
{ "_id" : ObjectId("5e8351eeb0f3fa88e22790b5"), "Name" : "Mike" }
참고: 최신 MongoDB 버전에서는 deleteMany() 사용 권장
MongoDB 4.2부터 remove() 메서드는 공식적으로 지원 중단(deprecated)되었으므로, 새 프로젝트에서는 deleteOne() 또는 deleteMany()를 사용하는 것이 좋습니다. 위 예제를 최신 버전에 맞게 바꾸면 다음과 같습니다.
> db.demo488.deleteMany({_id: {$in: deleteData}})