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

MongoDB에서 필드가 존재하지 않거나 null 또는 false인 문서 조회하는 방법

MongoDB에서 특정 필드가 존재하지 않거나, 값이 null이거나, false인 문서를 한 번에 조회해야 하는 경우가 종종 있습니다. 이럴 때 $in 연산자를 사용하면 간단하게 해결할 수 있습니다.

이 글에서는 예제 컬렉션을 만들고, $in 연산자를 활용해 원하는 조건의 문서만 조회하는 방법을 단계별로 살펴보겠습니다.

1. 예제 컬렉션 생성 및 데이터 삽입

먼저 테스트용 컬렉션을 생성하고 여러 개의 문서를 삽입합니다. 일부 문서에는 해당 필드가 아예 없고, 일부 문서에는 true, false, null 값이 들어가도록 구성했습니다.

> db.selectMongoDBDocumentsWithSomeCondition.insertOne({"StudentId":1,"StudentName":"Larry"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9010215705caea966c557f")
}
> db.selectMongoDBDocumentsWithSomeCondition.insertOne({"StudentId":2,"StudentName":"Mike","hasAgeGreaterThanOrEqualTo18":true});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c90106a5705caea966c5580")
}
> db.selectMongoDBDocumentsWithSomeCondition.insertOne({"StudentId":3,"StudentName":"Carol","hasAgeGreaterThanOrEqualTo18":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9010795705caea966c5581")
}
> db.selectMongoDBDocumentsWithSomeCondition.insertOne({"StudentId":4,"StudentName":"Sam","hasAgeGreaterThanOrEqualTo18":null});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9010865705caea966c5582")
}
> db.selectMongoDBDocumentsWithSomeCondition.insertOne({"StudentId":5,"StudentName":"David","hasAgeGreaterThanOrEqualTo18":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9010945705caea966c5583")
}
> db.selectMongoDBDocumentsWithSomeCondition.insertOne({"StudentId":6,"StudentName":"Chris","hasAgeGreaterThanOrEqualTo18":null});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9010a45705caea966c5584")
}
> db.selectMongoDBDocumentsWithSomeCondition.insertOne({"StudentId":7,"StudentName":"Robert","hasAgeGreaterThanOrEqualTo18":true});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9010b05705caea966c5585")
}

2. 전체 문서 확인

find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 출력해 보겠습니다.

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

위 쿼리의 실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5c9010215705caea966c557f"),
   "StudentId" : 1,
   "StudentName" : "Larry"
}
{
   "_id" : ObjectId("5c90106a5705caea966c5580"),
   "StudentId" : 2,
   "StudentName" : "Mike",
   "hasAgeGreaterThanOrEqualTo18" : true
}
{
   "_id" : ObjectId("5c9010795705caea966c5581"),
   "StudentId" : 3,
   "StudentName" : "Carol",
   "hasAgeGreaterThanOrEqualTo18" : false
}
{
   "_id" : ObjectId("5c9010865705caea966c5582"),
   "StudentId" : 4,
   "StudentName" : "Sam",
   "hasAgeGreaterThanOrEqualTo18" : null
}
{
   "_id" : ObjectId("5c9010945705caea966c5583"),
   "StudentId" : 5,
   "StudentName" : "David",
   "hasAgeGreaterThanOrEqualTo18" : false
}
{
   "_id" : ObjectId("5c9010a45705caea966c5584"),
   "StudentId" : 6,
   "StudentName" : "Chris",
   "hasAgeGreaterThanOrEqualTo18" : null
}
{
   "_id" : ObjectId("5c9010b05705caea966c5585"),
   "StudentId" : 7,
   "StudentName" : "Robert",
   "hasAgeGreaterThanOrEqualTo18" : true
}

3. $in 연산자로 조건에 맞는 문서 조회하기

이제 핵심 부분입니다. 필드가 존재하지 않거나, null이거나, false인 문서를 조회하려면 $in 연산자에 [false, null] 배열을 지정하면 됩니다.

> db.selectMongoDBDocumentsWithSomeCondition.find({ "hasAgeGreaterThanOrEqualTo18": {$in: [false,null]}}).pretty();

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

{
   "_id" : ObjectId("5c9010215705caea966c557f"),
   "StudentId" : 1,
   "StudentName" : "Larry"
}
{
   "_id" : ObjectId("5c9010795705caea966c5581"),
   "StudentId" : 3,
   "StudentName" : "Carol",
   "hasAgeGreaterThanOrEqualTo18" : false
}
{
   "_id" : ObjectId("5c9010865705caea966c5582"),
   "StudentId" : 4,
   "StudentName" : "Sam",
   "hasAgeGreaterThanOrEqualTo18" : null
}
{
   "_id" : ObjectId("5c9010945705caea966c5583"),
   "StudentId" : 5,
   "StudentName" : "David",
   "hasAgeGreaterThanOrEqualTo18" : false
}
{
   "_id" : ObjectId("5c9010a45705caea966c5584"),
   "StudentId" : 6,
   "StudentName" : "Chris",
   "hasAgeGreaterThanOrEqualTo18" : null
}

결과 분석 및 핵심 포인트

출력 결과를 보면 StudentId가 1, 3, 4, 5, 6인 문서만 반환되었습니다. 즉, 다음 세 가지 경우가 모두 포함됩니다.

  • 필드 자체가 없는 문서: Larry(StudentId 1)처럼 hasAgeGreaterThanOrEqualTo18 필드가 아예 존재하지 않는 경우
  • 값이 null인 문서: Sam(4), Chris(6)처럼 필드 값이 명시적으로 null인 경우
  • 값이 false인 문서: Carol(3), David(5)처럼 필드 값이 false인 경우

여기서 중요한 점은 MongoDB에서 $in 조건에 null을 포함하면, 해당 필드가 존재하지 않는 문서까지 함께 매칭된다는 것입니다. 이는 MongoDB의 기본 동작 방식으로, 필드 누락과 null 값을 동일하게 처리하고 싶을 때 매우 유용합니다.

반대로 필드가 실제로 존재하면서 값이 null인 문서만 정확히 조회하고 싶다면 $exists 연산자와 $ne(not equal) 연산자를 조합하여 쿼리를 작성할 수 있습니다. 상황에 맞게 적절한 연산자를 선택해 사용하시기 바랍니다.