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

MongoDB에서 $pull 연산자로 행렬(중첩 배열) 문서의 값 제거하기

MongoDB에서 $pull로 행렬 형태 문서의 값 제거하기

MongoDB에서 행렬(matrix)처럼 중첩된 배열 구조를 가진 문서에서 특정 값을 제거하려면 $pull 연산자를 사용합니다. $pull은 지정된 조건과 일치하는 값을 배열에서 모두 삭제해 주는 업데이트 연산자입니다.

1. 샘플 컬렉션 생성 및 문서 삽입

먼저 insertOne() 메서드를 사용하여 2차원 배열(arrayMatrix) 필드를 가진 문서를 컬렉션에 삽입해 보겠습니다.

> db.demo632.insertOne(
...    {
...        "arrayMatrix": [
...            [10,20],
...            [10,20],
...            [10,20],
...            [10,20],
...            [10,20],
...            [10,20]
...        ]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9b27b46c954c74be91e6c0")
}

2. 삽입된 문서 확인

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회하고, 데이터가 정상적으로 저장되었는지 확인합니다.

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

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : ObjectId("5e9b27b46c954c74be91e6c0"),
    "arrayMatrix" : [
        [
            10,
            20
        ],
        [
            10,
            20
        ],
        [
            10,
            20
        ],
        [
            10,
            20
        ],
        [
            10,
            20
        ],
        [
            10,
            20
        ]
    ]
}

3. $pull을 이용한 값 제거 쿼리

다음은 MongoDB에서 행렬 형태의 문서에서 값을 제거하는 쿼리입니다. arrayMatrix의 각 인덱스(0~5)에 해당하는 하위 배열에서 값 20을 모두 제거합니다.

> db.demo632.update(
...    {},
...    {
...        "$pull": {
...            "arrayMatrix.0": 20,
...            "arrayMatrix.1": 20,
...            "arrayMatrix.2": 20,
...            "arrayMatrix.3": 20,
...            "arrayMatrix.4": 20,
...            "arrayMatrix.5": 20
...        }
...    }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

참고: 최신 버전의 MongoDB에서는 update() 대신 updateMany() 또는 updateOne() 메서드 사용이 권장됩니다. 위 예제는 여러 문서에 적용하려면 첫 번째 인수로 빈 객체 {} 대신 원하는 조건을 지정하면 됩니다.

4. 업데이트 결과 확인

업데이트가 완료되면 다시 find() 메서드로 문서를 조회하여 변경 사항을 확인합니다.

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

최종 출력 결과는 다음과 같습니다. 각 하위 배열에서 값 20이 모두 제거되고 10만 남아 있는 것을 볼 수 있습니다.

{
    "_id" : ObjectId("5e9b27b46c954c74be91e6c0"),
    "arrayMatrix" : [
        [
            10
        ],
        [
            10
        ],
        [
            10
        ],
        [
            10
        ],
        [
            10
        ],
        [
            10
        ]
    ]
}

정리

$pull 연산자는 "필드명.인덱스" 경로를 지정함으로써 중첩 배열(행렬)의 특정 위치에 있는 값까지 정밀하게 삭제할 수 있습니다. 조건과 일치하는 모든 요소가 한 번의 업데이트로 제거되므로, 배열 데이터 정리 작업에 매우 유용하게 활용됩니다.