MongoDB에서 연산자를 활용한 값 쿼리 방법
이 글에서는 MongoDB에서 $eq, $not, $gt 연산자를 조합하여 배열 필드 안에 있는 특정 값을 조회하는 방법을 단계별로 살펴보겠습니다. 예제를 통해 실제 쿼리 작성법과 실행 결과까지 함께 확인할 수 있습니다.
1단계: 샘플 컬렉션 생성하기
먼저 테스트에 사용할 문서들이 담긴 컬렉션을 생성합니다. 각 문서는 학생 ID(_id)와 여러 개의 점수(Score)를 담고 있는 ScoreDetails 배열로 구성되어 있습니다.
> db.queryMongoValueDemo.insertOne(
{
_id:101,
"ScoreDetails":[{Score:80},{Score:45},{Score:25},{Score:70}]
}
);
{ "acknowledged" : true, "insertedId" : 101 }
> db.queryMongoValueDemo.insertOne(
{
_id:102,
"ScoreDetails":[{Score:80},{Score:24},{Score:34}]
}
);
{ "acknowledged" : true, "insertedId" : 102 }
> db.queryMongoValueDemo.insertOne(
{
_id:103,
"ScoreDetails":[{Score:99},{Score:95}]
}
);
{ "acknowledged" : true, "insertedId" : 103 }
2단계: find() 메서드로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.queryMongoValueDemo.find().pretty();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 101,
"ScoreDetails" : [
{
"Score" : 80
},
{
"Score" : 45
},
{
"Score" : 25
},
{
"Score" : 70
}
]
}
{
"_id" : 102,
"ScoreDetails" : [
{
"Score" : 80
},
{
"Score" : 24
},
{
"Score" : 34
}
]
}
{
"_id" : 103,
"ScoreDetails" : [
{
"Score" : 99
},
{
"Score" : 95
}
]
}
3단계: $eq와 $not, $gt 연산자로 조건 쿼리 실행하기
이제 핵심 쿼리를 살펴보겠습니다. 아래 쿼리는 배열 안에 정확히 80점인 값이 존재하고($eq), 동시에 80보다 큰 값은 하나도 없어야 하는($not + $gt) 문서만 찾습니다.
> db.queryMongoValueDemo.find({
"ScoreDetails.Score": {
"$eq": 80,
"$not": { "$gt": 80 }
}
});
실행 결과는 다음과 같습니다.
{ "_id" : 101, "ScoreDetails" : [ { "Score" : 80 }, { "Score" : 45 }, { "Score" : 25 }, { "Score" : 70 } ] }
{ "_id" : 102, "ScoreDetails" : [ { "Score" : 80 }, { "Score" : 24 }, { "Score" : 34 } ] }
결과 분석
쿼리 결과로 _id가 101과 102인 문서 두 개만 반환되었습니다. 그 이유는 다음과 같습니다.
- _id 101, 102: 두 문서 모두 80점이 포함되어 있고(
$eq: 80충족), 80보다 큰 점수가 없으므로($not: { $gt: 80 }충족) 조건에 해당합니다. - _id 103: 99점과 95점처럼 80보다 큰 값이 존재하기 때문에
$not조건에 걸려 결과에서 제외됩니다.
이처럼 MongoDB에서는 비교 연산자와 논리 부정 연산자를 조합하면 배열 필드 내부의 복잡한 조건도 간결하게 처리할 수 있습니다.