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

MongoDB에서 $nor와 $and로 특정 문서를 제외한 나머지 문서 조회하기

MongoDB에서 쿼리 결과의 역(inverse), 즉 특정 조건에 해당하는 문서를 제외한 나머지 모든 문서를 조회하고 싶다면 $nor 연산자와 $and 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 테스트용 컬렉션을 만들고 문서를 삽입합니다. 아래 예제에서는 학생 이름과 점수를 담은 세 개의 문서를 demo1 컬렉션에 추가합니다.

> db.demo1.insertOne({"StudentName":"Chris","StudentMarks":38});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e08a4f025ddae1f53b62216")
}
> db.demo1.insertOne({"StudentName":"David","StudentMarks":78});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e08a4f725ddae1f53b62217")
}
> db.demo1.insertOne({"StudentName":"Mike","StudentMarks":96});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e08a4fd25ddae1f53b62218")
}

2. 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo1.find().pretty();

위 쿼리를 실행하면 다음과 같이 세 개의 문서가 모두 출력됩니다.

{
   "_id" : ObjectId("5e08a4f025ddae1f53b62216"),
   "StudentName" : "Chris",
   "StudentMarks" : 38
}
{
   "_id" : ObjectId("5e08a4f725ddae1f53b62217"),
   "StudentName" : "David",
   "StudentMarks" : 78
}
{
   "_id" : ObjectId("5e08a4fd25ddae1f53b62218"),
   "StudentName" : "Mike",
   "StudentMarks" : 96
}

3. $nor와 $and로 쿼리의 역 구하기

이제 핵심 부분입니다. '이름이 David이면서 점수가 78점인 문서'를 제외한 나머지 문서만 조회하려면 다음과 같이 작성합니다.

> db.demo1.find({$nor:[{$and:[{'StudentName':'David'},{'StudentMarks':78}]}]});

쿼리 동작 원리

  • $and: 여러 조건을 모두 만족하는 문서를 찾습니다. 여기서는 'StudentName이 David'이고 'StudentMarks가 78'인 문서를 의미합니다.
  • $nor: 내부 조건을 만족하지 않는(즉, 해당 조건의 논리적 반대인) 문서를 반환합니다.

실행 결과

위 쿼리를 실행하면 David(78점)의 레코드는 제외되고, 나머지 학생들의 기록만 출력됩니다.

{ "_id" : ObjectId("5e08a4f025ddae1f53b62216"), "StudentName" : "Chris", "StudentMarks" : 38 }
{ "_id" : ObjectId("5e08a4fd25ddae1f53b62218"), "StudentName" : "Mike", "StudentMarks" : 96 }

마무리

이처럼 MongoDB에서는 $nor$and를 조합하면 복잡한 조건의 역집합도 손쉽게 조회할 수 있습니다. 여러 개의 필드 조건을 동시에 배제해야 하는 상황에서 매우 유용하게 활용할 수 있으니, 실제 프로젝트에서 필요에 맞게 응용해 보시기 바랍니다.