MongoDB에서 배열에 특정 필드 값이 포함되지 않은 문서 찾기
MongoDB에서 배열(array) 안에 담긴 문서 중 특정 필드 값을 가진 항목이 하나도 없는 문서를 조회하고 싶다면 $nin 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 컬렉션 생성부터 조건 조회까지 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 학생 성적 데이터를 담은 두 개의 문서를 삽입합니다.
> db.documentWithAParticularFieldValueDemo.insertOne(
{
"StudentId": 101,
"StudentDetails": [
{ "TheoryMarks": 78, "PracticalMarks": 91 },
{ "TheoryMarks": 75, "PracticalMarks": 75 }
]
}
);
{
"acknowledged": true,
"insertedId": ObjectId("5c8edab72f684a30fbdfd586")
}
> db.documentWithAParticularFieldValueDemo.insertOne(
{
"StudentId": 102,
"StudentDetails": [
{ "TheoryMarks": 91, "PracticalMarks": 91 },
{ "TheoryMarks": 75, "PracticalMarks": 75 }
]
}
);
{
"acknowledged": true,
"insertedId": ObjectId("5c8edaf12f684a30fbdfd587")
}2단계: find() 메서드로 전체 문서 확인
find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.
> db.documentWithAParticularFieldValueDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8edab72f684a30fbdfd586"),
"StudentId" : 101,
"StudentDetails" : [
{
"TheoryMarks" : 78,
"PracticalMarks" : 91
},
{
"TheoryMarks" : 75,
"PracticalMarks" : 75
}
]
}
{
"_id" : ObjectId("5c8edaf12f684a30fbdfd587"),
"StudentId" : 102,
"StudentDetails" : [
{
"TheoryMarks" : 91,
"PracticalMarks" : 91
},
{
"TheoryMarks" : 75,
"PracticalMarks" : 75
}
]
}3단계: $nin 연산자로 조건에 맞는 문서만 조회
이제 본격적으로 $nin 연산자를 사용해, StudentDetails 배열 안에 TheoryMarks 값이 78인 문서가 포함되지 않은 도큐먼트만 조회해 보겠습니다.
> db.documentWithAParticularFieldValueDemo.find({'StudentDetails.TheoryMarks': {$nin: [78]}}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8edaf12f684a30fbdfd587"),
"StudentId" : 102,
"StudentDetails" : [
{
"TheoryMarks" : 91,
"PracticalMarks" : 91
},
{
"TheoryMarks" : 75,
"PracticalMarks" : 75
}
]
}결과 분석 및 정리
출력 결과를 보면 StudentId가 101인 첫 번째 문서는 StudentDetails 배열 안에 TheoryMarks가 78인 요소가 존재하기 때문에 결과에서 제외되었습니다. 반면 해당 값이 없는 StudentId 102 문서만 정상적으로 반환된 것을 확인할 수 있습니다.
핵심은 점 표기법(dot notation)입니다. '배열경로.필드명' 형태로 조건을 작성하면 MongoDB가 배열 내부의 각 요소를 순회하며 조건을 평가하고, $nin은 지정한 값 목록에 속하지 않는 경우에만 매칭시켜 줍니다. 이 방식은 시험 점수, 주문 상태 등 배열 형태로 저장된 하위 문서에서 특정 값을 배제하고 조회해야 할 때 매우 유용하게 활용됩니다.