MongoDB에서 $and 연산의 반대되는 결과, 즉 조건을 반전시킨 결과를 얻고 싶다면 $or 연산자와 $ne 연산자를 함께 사용하면 됩니다. 논리학의 드 모르간(De Morgan) 법칙에 따르면 'NOT(A AND B)'은 'NOT A OR NOT B'와 동일합니다. 따라서 각 조건을 $ne(같지 않음)으로 부정한 뒤 $or로 결합하면, 원래 $and 조건의 정반대 결과를 손쉽게 얻을 수 있습니다.
1. 샘플 데이터 준비
먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo4.insert({uid:1,"Name":"Chris","Age":22});
WriteResult({ "nInserted" : 1 })
> db.demo4.insert({uid:2,"Name":"David","Age":21});
WriteResult({ "nInserted" : 1 })
> db.demo4.insert({uid:3,"Name":"Bob","Age":23});
WriteResult({ "nInserted" : 1 })
> db.demo4.insert({uid:1,"Name":"Carol","Age":20});
WriteResult({ "nInserted" : 1 })2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo4.find();
위 쿼리를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
{ "_id" : ObjectId("5e0a1da125ddae1f53b62221"), "uid" : 1, "Name" : "Chris", "Age" : 22 }
{ "_id" : ObjectId("5e0a1db025ddae1f53b62222"), "uid" : 2, "Name" : "David", "Age" : 21 }
{ "_id" : ObjectId("5e0a1dc225ddae1f53b62223"), "uid" : 3, "Name" : "Bob", "Age" : 23 }
{ "_id" : ObjectId("5e0a1dd225ddae1f53b62224"), "uid" : 1, "Name" : "Carol", "Age" : 20 }3. $and의 반대 결과 조회하기
이제 $or과 $ne를 조합하여 반전된 결과를 가져오는 쿼리를 살펴보겠습니다.
> db.demo4.find({uid:2,$or: [{"Name": {$ne: "Carol"}}, {"Age": {$ne: 21}}]});위 쿼리의 실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e0a1db025ddae1f53b62222"), "uid" : 2, "Name" : "David", "Age" : 21 }쿼리 동작 원리
이 쿼리는 'uid가 2'이면서 동시에 'Name이 Carol이 아니거나, Age가 21이 아닌' 문서를 찾습니다. 만약 같은 조건을 $and로 작성했다면 Name이 Carol이고 Age가 21인 문서만 매칭되었을 것입니다. 반면 $or과 $ne를 사용하면 두 조건 중 하나라도 일치하지 않는 모든 문서가 반환되므로, 결과적으로 $and 조건의 논리적 반전(NOT)을 구현하게 됩니다. 이처럼 MongoDB에서는 $nor 연산자를 사용하는 방법도 있지만, $or과 $ne의 조합 역시 널리 쓰이는 표준적인 패턴입니다.