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

MongoDB에서 단일 문서만 삭제하는 방법

MongoDB에서 컬렉션에 있는 여러 문서 중 단 하나의 문서만 삭제하고 싶을 때가 있습니다. 이때는 remove() 메서드를 활용할 수 있습니다. 이 글에서는 예제를 통해 특정 조건에 맞는 문서 하나만 안전하게 제거하는 방법을 단계별로 살펴보겠습니다.

1. 테스트용 컬렉션 생성하기

먼저 실습에 사용할 컬렉션을 만들고 문서 세 개를 삽입해 보겠습니다.

> db.removeOnlyOneDocumentDemo.insertOne({"FirstName":"John","LastName":"Smith"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cc6ca2f9cb58ca2b005e674")
}
> db.removeOnlyOneDocumentDemo.insertOne({"FirstName":"Carol","LastName":"Taylor"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cc6ca399cb58ca2b005e675")
}
> db.removeOnlyOneDocumentDemo.insertOne({"FirstName":"David","LastName":"Miller"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cc6ca429cb58ca2b005e676")
}

2. 전체 문서 조회하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.removeOnlyOneDocumentDemo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cc6ca2f9cb58ca2b005e674"),
   "FirstName" : "John",
   "LastName" : "Smith"
}
{
   "_id" : ObjectId("5cc6ca399cb58ca2b005e675"),
   "FirstName" : "Carol",
   "LastName" : "Taylor"
}
{
   "_id" : ObjectId("5cc6ca429cb58ca2b005e676"),
   "FirstName" : "David",
   "LastName" : "Miller"
}

3. 단일 문서만 삭제하기

이제 FirstName이 "David"인 문서 하나만 삭제해 보겠습니다. 핵심은 먼저 findOne()으로 해당 문서를 찾아 _id 값을 추출한 뒤, 그 고유한 _id로 삭제 조건을 지정하는 것입니다. _id는 각 문서마다 유일하므로, 이 방식을 사용하면 정확히 한 개의 문서만 제거됩니다.

> var documentValue = db.removeOnlyOneDocumentDemo.findOne({'FirstName':'David'});
> db.removeOnlyOneDocumentDemo.remove({_id:documentValue._id});
WriteResult({ "nRemoved" : 1 })

실행 결과인 nRemoved : 1은 정확히 한 개의 문서가 삭제되었음을 의미합니다.

4. 삭제 결과 확인하기

다시 전체 문서를 조회하여 해당 문서가 실제로 제거되었는지 확인해 보겠습니다.

> db.removeOnlyOneDocumentDemo.find().pretty();

출력 결과에서 "David" 문서가 사라진 것을 확인할 수 있습니다.

{
   "_id" : ObjectId("5cc6ca2f9cb58ca2b005e674"),
   "FirstName" : "John",
   "LastName" : "Smith"
}
{
   "_id" : ObjectId("5cc6ca399cb58ca2b005e675"),
   "FirstName" : "Carol",
   "LastName" : "Taylor"
}

참고: 최신 MongoDB에서는 deleteOne() 사용 권장

MongoDB 3.2 버전부터는 remove() 메서드가 deprecated(사용 중단 권고) 상태이며, 대신 deleteOne()deleteMany() 메서드를 사용하는 것이 좋습니다. 위 예제와 동일한 작업은 다음 한 줄로 더 간단하게 처리할 수 있습니다.

> db.removeOnlyOneDocumentDemo.deleteOne({"FirstName":"David"});
{ "acknowledged" : true, "deletedCount" : 1 }

deleteOne()은 조건에 일치하는 문서가 여러 개라도 가장 먼저 발견된 단 하나의 문서만 삭제하므로, 단일 문서 제거 작업에 가장 적합한 메서드입니다.