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를 동시에 매칭할 수 있으므로, 복잡한 조건의 배열 검색도 손쉽게 처리할 수 있습니다.