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

MongoDB에서 배열의 N번째 요소 삭제하기 – $unset과 $pull 연산자 활용법

MongoDB에서 배열의 특정 위치에 있는 요소(n번째 요소)를 삭제하려면 $unset 연산자와 $pull 연산자를 업데이트 쿼리와 함께 사용하면 됩니다. 두 연산자의 역할은 다음과 같습니다.

  • $unset: 지정한 필드 또는 배열 요소의 값을 제거합니다. 배열 요소에 적용하면 해당 자리가 null로 대체됩니다.
  • $pull: 배열에서 조건과 일치하는 값을 완전히 삭제합니다. 여기서는 $unset으로 생긴 null 값을 정리하는 용도로 사용됩니다.

그럼 실제 예제를 통해 단계별로 살펴보겠습니다.

1단계: 문서가 포함된 컬렉션 생성

먼저 테스트에 사용할 컬렉션을 만들고 문서를 삽입합니다. 쿼리는 다음과 같습니다.

> db.getNThElementDemo.insertOne({"UserName":"John","UserAge":23,"ListOfFriends":["Carol","Sam","Mike","Bob"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c94ee7516f542d757e2b43e")
}
> db.getNThElementDemo.insertOne({"UserName":"David","UserAge":21,"ListOfFriends":["Chris","Robert"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c94eeaa16f542d757e2b43f")
}

2단계: find()로 전체 문서 확인

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

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

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5c94ee7516f542d757e2b43e"),
   "UserName" : "John",
   "UserAge" : 23,
   "ListOfFriends" : [
      "Carol",
      "Sam",
      "Mike",
      "Bob"
   ]
}
{
   "_id" : ObjectId("5c94eeaa16f542d757e2b43f"),
   "UserName" : "David",
   "UserAge" : 21,
   "ListOfFriends" : [
      "Chris",
      "Robert"
   ]
}

3단계: $unset과 $pull로 n번째 요소 삭제

배열의 n번째 요소를 삭제하는 쿼리는 다음과 같습니다. 먼저 $unset으로 세 번째 요소(인덱스 2)의 값을 제거한 뒤, $pull로 배열에 남은 null 값을 완전히 빼냅니다.

> db.getNThElementDemo.update({}, {$unset : {"ListOfFriends.2" : 1 }});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.getNThElementDemo.update({}, {$pull : {"ListOfFriends" : null}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

4단계: 삭제 결과 확인

다시 find() 메서드를 실행하면 n번째 요소가 실제로 제거되었는지 확인할 수 있습니다.

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

실행 결과는 다음과 같습니다. John의 친구 목록에서 세 번째 요소였던 "Mike"가 사라진 것을 볼 수 있습니다.

{
   "_id" : ObjectId("5c94ee7516f542d757e2b43e"),
   "UserName" : "John",
   "UserAge" : 23,
   "ListOfFriends" : [
      "Carol",
      "Sam",
      "Bob"
   ]
}
{
   "_id" : ObjectId("5c94eeaa16f542d757e2b43f"),
   "UserName" : "David",
   "UserAge" : 21,
   "ListOfFriends" : [
      "Chris",
      "Robert"
   ]
}

정리

MongoDB에서 배열의 n번째 요소를 삭제하려면 $unset으로 해당 인덱스의 값을 제거한 후, $pullnull 값을 배열에서 제거하는 두 단계를 거치면 됩니다. 참고로 최신 MongoDB 버전에서는 updateOne()/updateMany() 메서드 사용이 권장되며, 조건 없이 모든 문서에 적용하려면 빈 필터 {}를 전달하면 됩니다.