MongoDB 배열 요소에서 필드 제거하기
MongoDB에서 배열 내부의 특정 요소에 포함된 필드(속성)를 삭제하려면 $unset 연산자와 위치 연산자($)를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 배열 안의 단일 문서에서 특정 필드만 깔끔하게 제거하는 방법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 학생 정보가 담긴 배열을 가진 문서로 컬렉션을 생성합니다. 아래 예제에서는 세 명의 학생 데이터를 StudentDetails 배열에 삽입합니다.
> db.unsetAnAttributeDemo.insertOne(
... {
... _id: 1,
... "StudentDetails": [
... {
... "StudentFirstName": "Ramit",
... "StudentCountryName":"UK"
... },
... {
... "StudentFirstName": "Bob",
... "StudentCountryName":"US"
... },
... {
... "StudentFirstName": "Carol",
... "StudentCountryName":"AUS"
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 1 }2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.unsetAnAttributeDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : 1,
"StudentDetails" : [
{
"StudentFirstName" : "Ramit",
"StudentCountryName" : "UK"
},
{
"StudentFirstName" : "Bob",
"StudentCountryName" : "US"
},
{
"StudentFirstName" : "Carol",
"StudentCountryName" : "AUS"
}
]
}3. $unset과 위치 연산자($)로 특정 요소의 필드 제거
이제 핵심 부분입니다. 조건 쿼리로 대상 요소를 찾은 뒤, 위치 연산자 $를 사용해 해당 배열 요소의 필드만 정확히 제거할 수 있습니다. 아래 예제에서는 값이 "AUS"인 요소의 StudentCountryName 필드를 삭제합니다.
> db.unsetAnAttributeDemo.update({"StudentDetails.StudentCountryName": "AUS"}, {$unset:
{"StudentDetails.$.StudentCountryName": 1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리 결과를 보면 nMatched: 1, nModified: 1로 표시되어, 하나의 문서가 성공적으로 수정되었음을 알 수 있습니다.
참고: 위치 연산자 $는 조건절에서 매칭된 첫 번째 배열 요소를 가리킵니다. 따라서 조건이 여러 요소와 일치하더라도 첫 번째 일치 요소에만 업데이트가 적용됩니다.
4. 결과 검증하기
다시 find() 메서드로 문서를 조회하여 StudentCountryName 필드가 실제로 제거되었는지 확인해 보겠습니다.
> db.unsetAnAttributeDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : 1,
"StudentDetails" : [
{
"StudentFirstName" : "Ramit",
"StudentCountryName" : "UK"
},
{
"StudentFirstName" : "Bob",
"StudentCountryName" : "US"
},
{
"StudentFirstName" : "Carol"
}
]
}출력 결과를 보면 세 번째 요소(Carol)에서 StudentCountryName 필드가 완전히 사라진 것을 확인할 수 있습니다. 나머지 요소(Ramit, Bob)의 필드는 그대로 유지됩니다.
정리
MongoDB에서 배열의 특정 요소에 있는 필드를 제거하려면 다음 두 가지를 기억하면 됩니다.
- $unset 연산자: 지정한 필드를 문서에서 삭제합니다.
- 위치 연산자($): 조건에 매칭된 배열 요소를 정확히 지정합니다.
두 연산자를 조합하면 배열 전체가 아닌 원하는 단일 요소의 필드만 선택적으로 제거할 수 있어, 복잡한 중첩 구조의 데이터를 다룰 때 매우 유용합니다.