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

MongoDB에서 조건에 맞는 요소를 다른 배열로 이동하는 방법

MongoDB에서 배열 안의 특정 조건에 해당하는 요소를 골라내어 다른 배열로 옮기고 싶을 때가 있습니다. 이럴 때는 forEach()로 문서를 순회하면서 filter()로 원하는 요소만 추출한 뒤, save() 메서드로 변경 사항을 저장하면 됩니다.

1. 샘플 컬렉션 생성하기

먼저 예제로 사용할 문서가 담긴 컬렉션을 생성해 보겠습니다. Information 배열에는 여러 개의 객체가 들어 있고, 비어 있는 different 배열도 함께 만들어 둡니다.

> db.demo646.insertOne(
...     {
...         "Information": [
...             { id: 100, Name: "Chris" },
...             { id: 100, Name: "Chris" },
...             { id: 101, Name: "David" },
...             { id: 100, Name: "Chris" }
...         ],
...         "different": []
...     }
... )
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9c82ec6c954c74be91e6ed")
}

2. 생성된 문서 확인하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

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

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

{
    "_id" : ObjectId("5e9c82ec6c954c74be91e6ed"),
    "Information" : [
        {
            "id" : 100,
            "Name" : "Chris"
        },
        {
            "id" : 100,
            "Name" : "Chris"
        },
        {
            "id" : 101,
            "Name" : "David"
        },
        {
            "id" : 100,
            "Name" : "Chris"
        }
    ],
    "different" : [ ]
}

3. 특정 요소를 다른 배열로 이동하는 쿼리

이제 핵심 부분입니다. 아래 쿼리는 forEach()로 모든 문서를 순회하면서, id 값이 101인 요소만 골라 different 배열로 옮기고, 나머지 요소들은 기존 Information 배열에 그대로 유지합니다.

> db.demo646.find({}).forEach(function(d) {
...     d.different = d.Information.filter(function(v) { return v.id == 101 })
...     d.Information = d.Information.filter(function(v) { return v.id != 101 })
...     db.demo646.save(d)
...     }
... )

쿼리의 동작 방식을 단계별로 살펴보면 다음과 같습니다.

  • 첫 번째 filter: id == 101인 요소들만 추출하여 different 배열에 할당합니다.
  • 두 번째 filter: id != 101인 요소들만 남겨 Information 배열을 갱신합니다.
  • save(): 변경된 문서 전체를 다시 저장하여 업데이트를 반영합니다.

4. 실행 결과 확인하기

쿼리 실행 후 다시 find() 메서드로 문서를 조회해 보겠습니다.

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

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

{
    "_id" : ObjectId("5e9c82ec6c954c74be91e6ed"),
    "Information" : [
        {
            "id" : 100,
            "Name" : "Chris"
        },
        {
            "id" : 100,
            "Name" : "Chris"
        },
        {
            "id" : 100,
            "Name" : "Chris"
        }
    ],
    "different" : [
        {
            "id" : 101,
            "Name" : "David"
        }
    ]
}

출력 결과를 보면 id가 101인 David의 데이터가 Information 배열에서 제거되고, 별도로 마련해 둔 different 배열로 성공적으로 이동한 것을 확인할 수 있습니다.

참고 사항

이 방식은 클라이언트 측(셸)에서 문서를 순회하며 처리하는 방법이므로, 대량의 데이터를 다룰 때는 성능에 유의해야 합니다. 프로덕션 환경에서는 $pull, $push 같은 업데이트 연산자나 집계 파이프라인(aggregate)을 활용하는 것이 더 효율적일 수 있습니다.