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

MongoDB에서 null이거나 설정되지 않은 필드를 가진 레코드 조회하는 방법

MongoDB에서 특정 필드가 null로 명시적으로 설정된 경우아예 존재하지 않는 경우는 서로 다른 쿼리 문법으로 구분해야 합니다. 이 두 가지 상황을 각각 살펴보겠습니다.

Case 1: 필드가 존재하면서 null로 설정된 경우

필드가 문서에 존재하고 값이 null인 레코드를 찾으려면 아래와 같은 문법을 사용합니다.

db.yourCollectionName.count({yourFieldName: null});

Case 2: 필드 자체가 존재하지 않는 경우

필드가 문서에 아예 없고 값도 설정되지 않은 레코드를 찾으려면 $exists 연산자를 활용합니다.

db.yourCollectionName.count({yourFieldName: {$exists: false}});

실습: 테스트 컬렉션 생성하기

두 문법의 차이를 실제로 확인하기 위해 샘플 컬렉션을 만들어 보겠습니다. 아래 쿼리로 컬렉션을 생성하고 문서를 삽입합니다.

> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Larry","EmployeeAge":null,"EmployeeSalary":18500});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a995c6cea1f28b7aa07fe")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Bob","EmployeeAge":21,"EmployeeSalary":23500});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a99836cea1f28b7aa07ff")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Carol","EmployeeSalary":45500});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a999b6cea1f28b7aa0800")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Mike","EmployeeAge":null,"EmployeeSalary":45500});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a99bb6cea1f28b7aa0801")
}
> db.fieldIsNullOrNotSetDemo.insertOne({"EmployeeName":"Ramit","EmployeeSalary":85500});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8a99d76cea1f28b7aa0802")
}

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

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

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

{
    "_id" : ObjectId("5c8a995c6cea1f28b7aa07fe"),
    "EmployeeName" : "Larry",
    "EmployeeAge" : null,
    "EmployeeSalary" : 18500
}
{
    "_id" : ObjectId("5c8a99836cea1f28b7aa07ff"),
    "EmployeeName" : "Bob",
    "EmployeeAge" : 21,
    "EmployeeSalary" : 23500
}
{
    "_id" : ObjectId("5c8a999b6cea1f28b7aa0800"),
    "EmployeeName" : "Carol",
    "EmployeeSalary" : 45500
}
{
    "_id" : ObjectId("5c8a99bb6cea1f28b7aa0801"),
    "EmployeeName" : "Mike",
    "EmployeeAge" : null,
    "EmployeeSalary" : 45500
}
{
    "_id" : ObjectId("5c8a99d76cea1f28b7aa0802"),
    "EmployeeName" : "Ramit",
    "EmployeeSalary" : 85500
}

위 데이터에서 Larry와 Mike는 EmployeeAge 필드가 null로 설정되어 있고, Carol과 Ramit은 EmployeeAge 필드 자체가 존재하지 않습니다.

Case 1 실행 결과: null로 설정된 필드 조회

EmployeeAge 필드가 존재하면서 null로 설정된 문서의 개수를 세어 보겠습니다.

> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: null});

실행 결과:

4

결과가 4로 나오는 점에 주목하세요. MongoDB에서 {필드명: null} 조건은 null 값을 가진 문서뿐만 아니라 해당 필드가 아예 존재하지 않는 문서까지 함께 매칭하기 때문입니다.

Case 2 실행 결과: 존재하지 않는 필드 조회

이번에는 EmployeeAge 필드 자체가 존재하지 않는 문서만 정확히 조회해 보겠습니다.

> db.fieldIsNullOrNotSetDemo.count({EmployeeAge: {$exists: false}});

실행 결과:

2

정리

{필드명: null} 쿼리는 null 값과 필드 부재 두 경우를 모두 포함하므로, 오직 '필드가 존재하지 않는' 문서만 찾고 싶다면 반드시 $exists: false 조건을 함께 사용해야 합니다. 반대로 null 값만 정확히 조회하려면 {필드명: {$type: 10}} 또는 {필드명: {$exists: true, $eq: null}} 형태로 쿼리를 작성할 수 있습니다. 이러한 차이를 이해하면 MongoDB에서 누락된 데이터나 기본값이 없는 레코드를 더욱 정확하게 다룰 수 있습니다.