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

MongoDB에서 범위 조건으로 내장 문서 배열 쿼리하는 방법

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: $ifNulluserDetails 필드가 없는 경우 빈 배열로 처리한 뒤, 배열 크기가 1 이상인 문서만 통과시킵니다.
  • $addFields + $filter: 배열의 각 요소($$this)에 대해 $gte(이상)와 $lte(이하) 조건을 $and로 결합하여, 지정한 범위에 속하는 요소만 남깁니다.

이처럼 애그리게이션 파이프라인의 $filter를 활용하면 복잡한 조건의 내장 문서 배열도 손쉽게 범위 기반으로 조회할 수 있습니다.