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

MongoDB 배열에서 요소 제거하기 – $pull 연산자 완벽 가이드

MongoDB에서 배열 요소를 제거하는 방법

MongoDB에서 배열(Array)에 저장된 특정 항목을 삭제하려면 $pull 연산자를 사용하면 됩니다. $pull은 지정한 조건과 일치하는 값을 배열에서 모두 제거해 주는 업데이트 연산자입니다.

실제 예제를 통해 살펴보겠습니다. 먼저 문서가 포함된 컬렉션을 생성합니다.

> db.removeItemFromArray.insertOne(
    { "_id":101, "StudentName":"Larry", "StudentSubjects":["C","MongoDB","Java","MySQL"] } );
{ "acknowledged" : true, "insertedId" : 101 }

1. 컬렉션의 전체 문서 조회하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다. pretty() 메서드를 함께 사용하면 결과를 보기 좋게 정렬하여 출력해 줍니다.

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : 101,
    "StudentName" : "Larry",
    "StudentSubjects" : [
        "C",
        "MongoDB",
        "Java",
        "MySQL"
    ]
}

현재 StudentSubjects 배열에는 "C", "MongoDB", "Java", "MySQL" 네 개의 과목이 저장되어 있습니다.

2. $pull 연산자로 배열 요소 제거하기

이제 배열에서 특정 항목을 제거하는 쿼리를 실행해 보겠습니다. 아래 예제에서는 "Java" 과목을 배열에서 삭제합니다.

> db.removeItemFromArray.update(
...     { },
...     { $pull: {StudentSubjects:"Java" } },
...     { multi: true }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

쿼리 구성 요소를 간단히 설명하면 다음과 같습니다.

  • 첫 번째 인수 { }: 업데이트 조건으로, 빈 객체를 지정하면 컬렉션의 모든 문서가 대상이 됩니다.
  • $pull: StudentSubjects 필드에서 값이 "Java"인 요소를 제거합니다.
  • multi: true: 조건에 일치하는 여러 문서를 한 번에 업데이트할 수 있도록 설정합니다.

실행 결과 nModified: 1이 반환되었으므로, 하나의 문서가 성공적으로 수정되었음을 알 수 있습니다.

3. 삭제 결과 확인하기

"Java" 항목이 정상적으로 제거되었는지 find() 메서드로 다시 확인해 보겠습니다.

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

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

{
    "_id" : 101,
    "StudentName" : "Larry",
    "StudentSubjects" : [
        "C",
        "MongoDB",
        "MySQL"
    ]
}

출력 결과를 보면 StudentSubjects 배열에서 "Java"가 사라진 것을 확인할 수 있습니다.

정리

MongoDB에서 배열의 특정 요소를 삭제할 때는 $pull 연산자를 사용하는 것이 가장 간단하고 효율적인 방법입니다. 참고로 MongoDB 4.2 이상 버전에서는 update() 대신 updateOne(), updateMany() 메서드 사용을 권장하고 있습니다. 예를 들어 위 쿼리는 다음과 같이 작성할 수도 있습니다.

> db.removeItemFromArray.updateMany(
...     { },
...     { $pull: { StudentSubjects: "Java" } }
... );

조건에 일치하는 모든 문서에서 해당 배열 요소를 안전하게 제거할 수 있으므로, 실무에서도 $pull을 적극 활용해 보시기 바랍니다.