MongoDB 배열에서 여러 조건으로 값 찾기
MongoDB에서 배열 필드 안의 값을 여러 조건으로 동시에 검색해야 하는 경우가 종종 있습니다. 예를 들어 어떤 값이 특정 음수보다 크면서 동시에 특정 양수보다 작은지 확인하고 싶다면, $elemMatch 연산자를 $gt(초과) 및 $lt(미만)와 함께 사용하면 됩니다.
기본 문법
db.yourCollectionName.find({yourFieldName:{$elemMatch:{$gt:yourNegativeValue,$lt:yourPositiveValue}}}).pretty();
$elemMatch를 사용해야 하는 이유
단순히 {StudentMarks: {$gt: -20, $lt: 20}}처럼 쿼리를 작성하면 두 조건이 서로 다른 배열 요소에 각각 적용될 수 있습니다. 즉, 하나의 요소가 -20보다 크고 또 다른 요소가 20보다 작아도 해당 문서가 매칭되어 버립니다. 반면 $elemMatch는 배열의 동일한 단일 요소가 모든 조건을 만족해야만 매칭되므로 정확한 범위 검색이 가능합니다.
예제 컬렉션 생성
문법을 제대로 이해하기 위해 실제 문서가 포함된 컬렉션을 만들어 보겠습니다. 아래 쿼리로 컬렉션과 문서를 생성할 수 있습니다.
> db.findValueInArrayWithMultipleCriteriaDemo.insertOne({"StudentName":"Larry","StudentMarks":[-150,150]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77daf6fc4e719b197a12f5")
}
> db.findValueInArrayWithMultipleCriteriaDemo.insertOne({"StudentName":"Mike","StudentMarks":[19]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77db09fc4e719b197a12f6")
}
저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.findValueInArrayWithMultipleCriteriaDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c77daf6fc4e719b197a12f5"),
"StudentName" : "Larry",
"StudentMarks" : [
-150,
150
]
}
{
"_id" : ObjectId("5c77db09fc4e719b197a12f6"),
"StudentName" : "Mike",
"StudentMarks" : [
19
]
}
여러 조건으로 배열 값 검색하기
이제 실제로 여러 조건을 적용해 배열에서 값을 찾아보겠습니다. 여기서는 -20보다 크고 20보다 작은 점수를 가진 학생을 찾는다고 가정합니다.
> db.findValueInArrayWithMultipleCriteriaDemo.find({StudentMarks:{$elemMatch:{$gt:-20,$lt:20}}}).pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c77db09fc4e719b197a12f6"),
"StudentName" : "Mike",
"StudentMarks" : [
19
]
}
결과를 살펴보면 Mike의 점수인 19만 -20 초과, 20 미만 조건을 모두 만족하므로 해당 문서만 반환되었습니다. Larry의 점수인 -150과 150은 둘 다 범위를 벗어나기 때문에 결과에 포함되지 않습니다.
정리
배열 요소 하나가 여러 조건을 동시에 만족해야 하는 상황이라면 $elemMatch가 정답입니다. $gt, $lt뿐 아니라 $gte, $lte, $ne 등 다양한 비교 연산자와 조합할 수 있으므로, 복잡한 배열 검색 로직도 손쉽게 구현할 수 있습니다.