MongoDB 배열에서 요소 제거하는 방법
MongoDB의 배열(Array) 필드에서 특정 요소를 제거하려면 update() 메서드와 $pull 연산자를 함께 사용하면 됩니다. $pull 연산자는 기존 배열에서 지정한 조건과 일치하는 값 또는 여러 값을 한 번에 모두 제거해 주는 강력한 도구입니다.
이 글에서는 실제 예제를 통해 중첩된 배열에서 요소를 삭제하는 과정을 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입합니다.
db.demo541.insertOne({"software":{"services":["gmail","facebook","yahoo"]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ca845ef4dcbee04fbbc11")
}
> db.demo541.insertOne({"software":{"services":["whatsapp","twitter"]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8ca85cef4dcbee04fbbc12")
}위 쿼리는 'software' 객체 안에 'services'라는 문자열 배열을 포함한 두 개의 문서를 생성합니다.
2단계: find() 메서드로 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo541.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e8ca845ef4dcbee04fbbc11"), "software" : { "services" : [ "gmail", "facebook", "yahoo" ] } }
{ "_id" : ObjectId("5e8ca85cef4dcbee04fbbc12"), "software" : { "services" : [ "whatsapp", "twitter" ] } }3단계: $pull 연산자로 배열 요소 제거
이제 첫 번째 문서의 services 배열에서 "yahoo" 항목을 제거해 보겠습니다. 점 표기법(dot notation)을 사용해 중첩된 배열 경로인 'software.services'를 지정하는 것이 핵심입니다.
> db.demo541.update({ _id: ObjectId("5e8ca845ef4dcbee04fbbc11") },
... { $pull: { 'software.services': "yahoo" }}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })결과를 보면 nMatched가 1(조건에 맞는 문서 1개), nModified가 1(실제 수정된 문서 1개)로, 업데이트가 성공적으로 수행되었음을 알 수 있습니다.
4단계: 최종 결과 확인
다시 find() 메서드로 전체 문서를 조회하여 변경 사항을 확인합니다.
> db.demo541.find();
실행 결과:
{ "_id" : ObjectId("5e8ca845ef4dcbee04fbbc11"), "software" : { "services" : [ "gmail", "facebook" ] } }
{ "_id" : ObjectId("5e8ca85cef4dcbee04fbbc12"), "software" : { "services" : [ "whatsapp", "twitter" ] } }첫 번째 문서의 services 배열에서 "yahoo"가 성공적으로 제거되어 ["gmail", "facebook"]만 남은 것을 확인할 수 있습니다.
참고 사항
- $pull 연산자는 단순 값뿐만 아니라 $in, 비교 연산자($gte, $lte 등)와 함께 사용하여 조건에 맞는 여러 요소를 한 번에 제거할 수 있습니다.
- MongoDB 4.2 이상 버전에서는 구식 update() 대신 updateOne() 또는 updateMany() 메서드를 사용하는 것이 권장됩니다.