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