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

MongoDB에서 $nin 연산자로 배열 내 특정 필드 값을 가진 문서가 없는 도큐먼트 조회하기

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은 지정한 값 목록에 속하지 않는 경우에만 매칭시켜 줍니다. 이 방식은 시험 점수, 주문 상태 등 배열 형태로 저장된 하위 문서에서 특정 값을 배제하고 조회해야 할 때 매우 유용하게 활용됩니다.