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

MongoDB에서 NAND 조건으로 쿼리하는 방법 – $or와 $ne 연산자 활용하기

MongoDB에서 NAND 조건 쿼리 구현하기

MongoDB의 $not 연산자는 단순한 조건만 반전시킬 수 있으며, 복잡한 표현식 전체를 반전(invert)하지 못한다는 한계가 있습니다. 따라서 NAND와 같은 논리 연산을 구현하려면 $or 또는 $and 연산자를 $ne(not equal) 연산자와 함께 조합하여 사용해야 합니다.

이번 글에서는 실제 예제를 통해 $or$ne를 활용해 NAND 조건을 조회하는 방법을 살펴보겠습니다.

1. 샘플 컬렉션 생성 및 문서 삽입

먼저 demo266이라는 컬렉션을 만들고 테스트용 문서들을 삽입합니다.

> db.demo266.insertOne({"active1":true,"active2":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e480f4b1627c0c63e7dbaa7")
}
> db.demo266.insertOne({"active1":true,"active2":true});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e480f501627c0c63e7dbaa8")
}
> db.demo266.insertOne({"active1":false,"active2":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e480f561627c0c63e7dbaa9")
}
> db.demo266.insertOne({"active1":false,"active2":true});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e480f701627c0c63e7dbaaa")
}

2. find() 메서드로 전체 문서 확인하기

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

> db.demo266.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e480f4b1627c0c63e7dbaa7"), "active1" : true, "active2" : false }
{ "_id" : ObjectId("5e480f501627c0c63e7dbaa8"), "active1" : true, "active2" : true }
{ "_id" : ObjectId("5e480f561627c0c63e7dbaa9"), "active1" : false, "active2" : false }
{ "_id" : ObjectId("5e480f701627c0c63e7dbaaa"), "active1" : false, "active2" : true }

3. $or와 $ne로 NAND 조건 조회하기

NAND는 NOT AND, 즉 두 조건이 모두 참인 경우를 제외한 나머지를 의미합니다. 이를 MongoDB에서 구현하려면 각 필드에 $ne: true 조건을 걸고, 이를 $or로 묶어주면 됩니다.

> db.demo266.find({$or:[{"active1":{"$ne":true}},{"active2":{"$ne":true}}]});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e480f4b1627c0c63e7dbaa7"), "active1" : true, "active2" : false }
{ "_id" : ObjectId("5e480f561627c0c63e7dbaa9"), "active1" : false, "active2" : false }
{ "_id" : ObjectId("5e480f701627c0c63e7dbaaa"), "active1" : false, "active2" : true }

결과 분석

출력된 문서를 보면 active1active2모두 true인 문서(_id: 5e480f501627c0c63e7dbaa8)만 결과에서 제외된 것을 확인할 수 있습니다. 이것이 바로 NAND 연산의 특징입니다.

정리하면, MongoDB에서는 $not으로 복합 조건을 직접 반전할 수 없기 때문에, 드모르간 법칙(De Morgan's Law)에 따라 NOT (A AND B)(A가 아님) OR (B가 아님) 형태로 변환한 뒤 $or$ne를 조합해 쿼리하는 것이 올바른 접근 방식입니다.