MongoDB에서 범위 조건으로 내장 문서 배열 쿼리하기
내장(embedded) 문서 배열을 특정 범위 조건으로 조회하려면 aggregate() 메서드를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성합니다. 각 문서는 여러 사용자 정보(이름과 점수)를 배열 형태로 가지고 있습니다.
> db.demo346.insertOne(
... {
... _id: 101,
... userDetails: [
... { UserName: "Chris", Score:78},
... { UserName: "David", Score:68},
... { UserName: "Bob", Score:88}
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo346.insertOne(
... {
... _id: 102,
... userDetails: [
... { UserName: "Mike", Score:92},
... { UserName: "Sam", Score:62},
... { UserName: "Carol", Score:97}
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 102 }2. 전체 문서 확인
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo346.find();
위 명령은 다음과 같은 결과를 출력합니다.
{
"_id" : 101, "userDetails" : [
{ "UserName" : "Chris", "Score" : 78 },
{ "UserName" : "David", "Score" : 68 },
{ "UserName" : "Bob", "Score" : 88 }
]
}
{
"_id" : 102, "userDetails" : [
{ "UserName" : "Mike", "Score" : 92 },
{ "UserName" : "Sam", "Score" : 62 },
{ "UserName" : "Carol", "Score" : 97 }
]
}3. 범위 조건으로 배열 필터링하기
다음은 MongoDB에서 내장 문서 배열을 점수 범위(80점 이상, 99점 이하)로 조회하는 방법입니다. $match, $addFields, $filter 연산자를 조합하여 배열 내 각 요소의 Score 값을 기준으로 필터링합니다.
> db.demo346.aggregate([
... { "$match": { "$expr": { "$gte": [{ "$size": { "$ifNull": ["$userDetails", []] } }, 1] }}},
... { "$addFields": {
... "userDetails": {
... "$filter": {
... "input": { "$ifNull": ["$userDetails", []] },
... "cond": {
... "$and": [
... { "$gte": ["$$this.Score", 80] },
... { "$lte": ["$$this.Score", 99] }
... ]
... }
... }
... }
... }}
... ])실행 결과는 다음과 같습니다. 점수가 80~99 사이인 사용자만 배열에 남게 됩니다.
{ "_id" : 101, "userDetails" : [ { "UserName" : "Bob", "Score" : 88 } ] }
{ "_id" : 102, "userDetails" : [ { "UserName" : "Mike", "Score" : 92 }, { "UserName" : "Carol", "Score" : 97 } ] }쿼리 동작 방식 설명
- $match:
$ifNull로userDetails필드가 없는 경우 빈 배열로 처리한 뒤, 배열 크기가 1 이상인 문서만 통과시킵니다. - $addFields + $filter: 배열의 각 요소(
$$this)에 대해$gte(이상)와$lte(이하) 조건을$and로 결합하여, 지정한 범위에 속하는 요소만 남깁니다.
이처럼 애그리게이션 파이프라인의 $filter를 활용하면 복잡한 조건의 내장 문서 배열도 손쉽게 범위 기반으로 조회할 수 있습니다.