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