MongoDB에서 배열의 특정 인덱스에 있는 요소를 제거하려면 $unset과 $pull이라는 두 가지 연산자를 순서대로 사용하는 두 단계 과정을 거쳐야 합니다.
1단계: $unset으로 해당 인덱스의 값을 null로 변경
먼저 아래와 같은 구문을 사용하여 제거하고자 하는 인덱스 위치의 값을 null로 만듭니다.
db.yourCollectionName.update({}, {$unset : {"yourArrayFieldName.yourIndexValue" : 1 }});위 구문을 실행하면 지정한 인덱스(yourIndexValue) 자리에 null 값이 삽입됩니다. 다만 이 시점에는 요소가 완전히 사라진 것이 아니라 null로 대체되었을 뿐이므로, 다음 단계에서 배열에서 null 값을 실제로 제거해 주어야 합니다.
2단계: $pull로 null 값 제거
이어서 아래 구문을 사용하여 배열 필드에서 null 값을 제거합니다.
db.yourCollectionName.update({}, {$pull : {"yourArrayFieldName" : null}});실습 예제
이제 위 구문을 실제로 적용해 보겠습니다. 먼저 문서 하나를 포함하는 컬렉션을 생성합니다.
> db.removeArrayElementByItsIndexDemo.insertOne({"InstructorName":"David",
"InstructorAge":28,"InstructorSubject":["MongoDB","MySQL","Java","SQL Server","PL/SQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8abbfc6cea1f28b7aa0803")
}find() 메서드를 사용하여 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.removeArrayElementByItsIndexDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8abbfc6cea1f28b7aa0803"),
"InstructorName" : "David",
"InstructorAge" : 28,
"InstructorSubject" : [
"MongoDB",
"MySQL",
"Java",
"SQL Server",
"PL/SQL"
]
}인덱스로 배열 요소 제거하기
이제 인덱스를 기준으로 배열 요소를 제거하는 쿼리를 살펴보겠습니다. 여기서는 세 번째 요소(인덱스 2)인 "Java"를 제거해 보겠습니다.
1단계 — $unset 실행
> db.removeArrayElementByItsIndexDemo.update({}, {$unset : {"InstructorSubject.2" : 1 }});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })2단계 — $pull 실행
> db.removeArrayElementByItsIndexDemo.update({}, {$pull : {"InstructorSubject" : null}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })결과 확인
배열 요소 "Java"가 실제로 제거되었는지 find() 메서드로 다시 확인해 보겠습니다.
> db.removeArrayElementByItsIndexDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8abbfc6cea1f28b7aa0803"),
"InstructorName" : "David",
"InstructorAge" : 28,
"InstructorSubject" : [
"MongoDB",
"MySQL",
"SQL Server",
"PL/SQL"
]
}출력 결과를 보면 배열 요소 "Java"가 완전히 제거된 것을 확인할 수 있습니다.
참고 사항
MongoDB 3.2 이상 버전에서는 update() 대신 updateOne() 또는 updateMany() 메서드를 사용하는 것이 권장됩니다. 예를 들어 특정 조건에 맞는 첫 번째 문서만 수정하려면 db.collection.updateOne({조건}, {연산자}) 형태로 작성하면 됩니다. 또한 배열 요소를 제거할 때는 항상 $unset 후 $pull을 함께 사용해야 하며, $unset만 실행하면 배열 중간에 null 값이 남아 있게 되므로 주의해야 합니다.