MongoDB에서 중첩된 배열(Nested Array) 항목 지우기
MongoDB에서 중첩된 배열 내부의 항목을 모두 비우고 싶다면 $set 연산자를 사용하면 됩니다. 이번 글에서는 실제 예제를 통해 컬렉션 생성부터 데이터 확인, 그리고 중첩 배열을 비우는 전체 과정을 단계별로 살펴보겠습니다.
1단계: 테스트용 컬렉션 생성하기
먼저 예제에 사용할 컬렉션을 만들어 보겠습니다. 아래 쿼리는 학생 정보와 프로젝트 세부 사항이 중첩된 구조의 문서를 하나 삽입합니다.
> db.clearingItemsInNestedArrayDemo.insertOne( {
... "StudentName" : "John",
... "StudentDetails" : [
... {
... "ProjectName" : "Online Banking",
... "ProjectDetails" : [
... {
... "TechnologyUsed" : "Java",
... "TeamSize": 5
... }
... ]
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9930b4330fd0aa0d2fe4ce")
}위 문서는 StudentName 필드와 함께 StudentDetails라는 배열을 가지며, 그 안에 다시 ProjectDetails라는 중첩 배열이 포함되어 있습니다.
2단계: 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.clearingItemsInNestedArrayDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5c9930b4330fd0aa0d2fe4ce"),
"StudentName" : "John",
"StudentDetails" : [
{
"ProjectName" : "Online Banking",
"ProjectDetails" : [
{
"TechnologyUsed" : "Java",
"TeamSize" : 5
}
]
}
]
}3단계: $set 연산자로 중첩 배열 비우기
이제 본격적으로 중첩 배열의 항목을 지워 보겠습니다. update() 메서드와 $set 연산자를 조합하여 StudentDetails 필드를 빈 배열([])로 설정합니다.
> db.clearingItemsInNestedArrayDemo.update({"StudentName": "John"}, {"$set": {"StudentDetails": []}});
Updated 1 existing record(s) in 4ms
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과를 보면 nMatched : 1, nModified : 1로 표시되며, 이는 조건에 일치하는 1개의 문서가 성공적으로 수정되었음을 의미합니다.
4단계: 수정 결과 검증하기
마지막으로 다시 한 번 find() 메서드를 실행하여 중첩 배열의 항목이 실제로 삭제되었는지 확인해 보겠습니다.
> db.clearingItemsInNestedArrayDemo.find().pretty();
결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9930b4330fd0aa0d2fe4ce"),
"StudentName" : "John",
"StudentDetails" : [ ]
}정리
이처럼 MongoDB에서 중첩 배열의 모든 항목을 제거하는 것은 매우 간단합니다. 핵심은 $set 연산자를 사용해 해당 배열 필드를 빈 배열([])로 덮어쓰는 것입니다. 참고로 최신 MongoDB 버전에서는 update() 대신 updateOne() 또는 updateMany() 메서드를 사용하는 것이 권장되므로, 실무 환경에서는 이를 활용하는 것이 좋습니다.