MongoDB에서 배열의 모든 요소가 특정 값을 가지는 문서 조회하기
MongoDB에서 배열 안의 모든 요소가 특정 값과 일치하는 문서만 골라내고 싶다면 find() 메서드에 $not, $elemMatch, $ne 연산자를 조합하여 사용할 수 있습니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1단계: 샘플 데이터 생성
먼저 문서를 담을 컬렉션을 생성합니다. insertOne() 메서드를 사용해 두 개의 문서를 삽입해 보겠습니다.
> db.findDocumentsDemo.insertOne(
{
_id: 101,
"ProductDetails": [
{ "ProductValue":100 },
{ "ProductValue":120 }
]
}
);
{ "acknowledged" : true, "insertedId" : 101 }
> db.findDocumentsDemo.insertOne(
{
_id: 102,
"ProductDetails": [
{ "ProductValue":120},
{ "ProductValue":120 },
{ "ProductValue":120 }
]
}
);
{ "acknowledged" : true, "insertedId" : 102 }
위 예제에서 첫 번째 문서(_id: 101)는 ProductValue가 100과 120으로 서로 다르고, 두 번째 문서(_id: 102)는 세 요소가 모두 120으로 동일합니다.
2단계: 전체 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.findDocumentsDemo.find().pretty();
쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 101,
"ProductDetails" : [
{
"ProductValue" : 100
},
{
"ProductValue" : 120
}
]
}
{
"_id" : 102,
"ProductDetails" : [
{
"ProductValue" : 120
},
{
"ProductValue" : 120
},
{
"ProductValue" : 120
}
]
}
3단계: 배열의 모든 요소가 특정 값인 문서 조회하기
이번에는 ProductDetails 배열의 모든 요소가 ProductValue 120을 가지는 문서만 조회해 보겠습니다. 핵심은 아래 두 조건을 동시에 적용하는 것입니다.
- 배열 안에 ProductValue가 120인 요소가 최소 하나 이상 존재할 것
- ProductValue가 120이 아닌 요소가 하나도 없을 것 (
$not+$elemMatch+$ne)
> db.findDocumentsDemo.find({
"ProductDetails.ProductValue" : 120,
"ProductDetails" : {
$not : {
$elemMatch : {
"ProductValue" : {
$ne : 120
}
}
}
}
});
쿼리를 실행하면 세 요소가 모두 120인 문서(_id: 102)만 다음과 같이 반환됩니다.
{ "_id" : 102, "ProductDetails" : [ { "ProductValue" : 120 }, { "ProductValue" : 120 }, { "ProductValue" : 120 } ] }
동작 원리 정리
"ProductDetails.ProductValue": 120— 점 표기법(dot notation)으로 배열 내 어느 한 요소라도 값이 120인지 확인합니다. 이 조건이 없으면 130처럼 다른 값으로만 구성된 문서도 결과에 포함될 수 있습니다.$not: { $elemMatch: { ... } }— "120이 아닌 값을 가진 요소"가 존재하는 문서를 제외합니다. 즉, 하나라도 120 외의 값이 섞여 있으면 해당 문서는 조회 대상에서 제외됩니다.
이렇게 두 조건을 함께 사용하면 배열의 모든 요소가 정확히 지정한 값(여기서는 120)과 일치하는 문서만 깔끔하게 추출할 수 있습니다.