Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 부분 데이터만 선택적으로 삭제하는 방법 (remove 활용 예제)

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}})