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

MongoDB 배열에서 여러 항목을 검색하는 쿼리 작성 방법

MongoDB에서 배열 내부에 저장된 여러 항목을 한 번에 검색하려면 애그리게이션 프레임워크(Aggregation Framework)를 활용하는 것이 가장 효과적입니다. 이 글에서는 실제 예제를 통해 배열 요소를 조건에 맞게 필터링하고, 원래의 배열 형태로 결과를 되돌려받는 과정을 단계별로 살펴보겠습니다.

1. 테스트용 컬렉션 생성

먼저 사용자 정보 배열을 포함하는 문서 하나로 컬렉션을 생성합니다.

> db.retrieveMultipleDemo.insertOne(
...   {
...      "UserDetails":
...      [
...         { "_id": "101", "UserName":"John", "UserAge": 23 },
...         { "_id": "102", "UserName":"Carol", "UserAge": 21 },
...         { "_id": "103", "UserName":"David", "UserAge": 23},
...         { "_id": "104", "UserName":"Sam", "UserAge": 25}
...      ]
...   }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd40c85edc6604c74817cf0")
}

insertOne()이 정상적으로 실행되면 위와 같이 acknowledged 값이 true로 반환됩니다.

2. 전체 문서 확인하기

find() 메서드에 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.

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

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

{
    "_id" : ObjectId("5cd40c85edc6604c74817cf0"),
    "UserDetails" : [
        {
            "_id" : "101",
            "UserName" : "John",
            "UserAge" : 23
        },
        {
            "_id" : "102",
            "UserName" : "Carol",
            "UserAge" : 21
        },
        {
            "_id" : "103",
            "UserName" : "David",
            "UserAge" : 23
        },
        {
            "_id" : "104",
            "UserName" : "Sam",
            "UserAge" : 25
        }
    ]
}

3. 배열에서 여러 항목 검색하기

이제 애그리게이션 파이프라인을 사용해 배열에서 조건에 맞는 여러 항목을 추출해 보겠습니다. 아래 예제에서 myIds는 검색 대상 ID 목록(예: ["101", "103"])을 담고 있는 변수라고 가정합니다.

> db.retrieveMultipleDemo.aggregate([
...   {$unwind:"$UserDetails"},
...   {$match:{"UserDetails._id":{$in:myIds},"UserDetails.UserAge":23}},
...   {$group:{"_id":"_id","UserDetails":{$push:"$UserDetails"}}},
...   {$project:{"_id":0,"UserDetails":1}}
... ]);

파이프라인 각 단계의 역할

  • $unwind – UserDetails 배열의 각 요소를 개별 문서로 분해합니다.
  • $match – _id가 myIds 목록에 포함되면서 UserAge가 23인 요소만 필터링합니다.
  • $group – 필터링된 요소들을 $push 연산자로 다시 하나의 UserDetails 배열로 재조립합니다.
  • $project – _id 필드는 제외하고 UserDetails만 결과에 포함시킵니다.

쿼리를 실행하면 나이가 23살인 John과 David의 정보만 담긴 배열이 반환됩니다.

{ "UserDetails" : [ { "_id" : "101", "UserName" : "John", "UserAge" : 23 }, { "_id" : "103", "UserName" : "David", "UserAge" : 23 } ] }

마무리

$unwind로 배열을 개별 문서로 분해한 뒤 $match로 조건에 맞는 요소만 걸러내고, $group으로 다시 배열 형태로 재조립하는 이 패턴은 MongoDB에서 배열 데이터를 다룰 때 가장 널리 쓰이는 기법 중 하나입니다. $in 연산자를 활용하면 여러 개의 ID를 동시에 매칭할 수 있으므로, 복잡한 조건의 배열 검색도 손쉽게 처리할 수 있습니다.