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

MongoDB에서 배열 요소 제거하기: $pull과 $in 연산자 활용 가이드

MongoDB에서 배열에 저장된 특정 요소를 제거하려면 $pull 연산자와 $in 연산자를 함께 사용하면 됩니다. 이 조합은 하나의 쿼리로 여러 배열에서 동시에 원하는 값을 삭제할 수 있어 매우 유용합니다.

기본 문법

배열 요소를 제거하는 기본적인 문법은 다음과 같습니다.

db.yourCollectionName.update({},
    {$pull:{yourFirstArrayName:{$in:["yourValue"]}, yourSecondArrayName:"yourValue"}},
    {multi:true}
);

각 부분의 역할은 다음과 같습니다.

  • $pull: 지정한 조건과 일치하는 값을 배열에서 모두 제거합니다.
  • $in: 배열 안에서 일치시킬 값의 목록을 지정합니다.
  • {multi:true}: 조건에 맞는 모든 문서에 업데이트를 적용합니다. 생략하면 첫 번째로 일치하는 문서 하나만 수정됩니다.

참고로 최신 MongoDB 버전(4.2 이상)에서는 update() 대신 updateMany() 사용이 권장되며, 동작 방식은 동일합니다.

예제 컬렉션 생성

문법을 이해하기 위해 먼저 샘플 컬렉션을 만들어 보겠습니다. 다음 쿼리는 학생 정보와 함께 두 개의 배열 필드를 포함한 문서를 삽입합니다.

> db.removeArrayElement.insertOne({
...   "StudentName": "Larry",
...   "StudentCoreSubject": ["MongoDB", "MySQL", "SQL Server", "Java"],
...   "StudentFavouriteTeacher": ["John", "Marry", "Carol"]
... });
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c6ec9c46fd07954a4890688")
}

삽입된 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

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

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

{
    "_id" : ObjectId("5c6ec9c46fd07954a4890688"),
    "StudentName" : "Larry",
    "StudentCoreSubject" : [
        "MongoDB",
        "MySQL",
        "SQL Server",
        "Java"
    ],
    "StudentFavouriteTeacher" : [
        "John",
        "Marry",
        "Carol"
    ]
}

배열 요소 제거 실행

이제 첫 번째 배열(StudentCoreSubject)에서 "Java"를, 두 번째 배열(StudentFavouriteTeacher)에서 "Marry"를 동시에 제거해 보겠습니다.

> db.removeArrayElement.update({},
... {$pull:{StudentCoreSubject:{$in:["Java"]}, StudentFavouriteTeacher:"Marry"}},
... {multi:true}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과를 보면 1개의 문서가 일치하고(nMatched), 1개의 문서가 성공적으로 수정되었습니다(nModified).

제거 결과 검증

두 요소가 실제로 삭제되었는지 확인하기 위해 문서를 다시 조회해 보겠습니다.

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

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

{
    "_id" : ObjectId("5c6ec9c46fd07954a4890688"),
    "StudentName" : "Larry",
    "StudentCoreSubject" : [
        "MongoDB",
        "MySQL",
        "SQL Server"
    ],
    "StudentFavouriteTeacher" : [
        "John",
        "Carol"
    ]
}

출력 결과를 살펴보면 첫 번째 배열(StudentCoreSubject)에는 더 이상 "Java"가 없고, 두 번째 배열(StudentFavouriteTeacher)에는 "Marry"가 사라진 것을 확인할 수 있습니다. 이처럼 $pull$in 연산자를 활용하면 단일 쿼리로 여러 배열의 요소를 손쉽게 제거할 수 있습니다.