MongoDB에서 부울 필드가 'true가 아닌' 문서 조회하기
MongoDB에서 특정 부울(Boolean) 필드의 값이 true가 아닌 문서만 골라내야 하는 경우가 종종 있습니다. 이럴 때는 $ne(not equal, 같지 않음) 연산자를 사용하면 간단하게 해결할 수 있습니다.
$ne 연산자 기본 문법
db.yourCollectionName.find({yourFieldName: {$ne: true}}).pretty();
$ne는 지정한 값과 일치하지 않는 모든 문서를 반환합니다. 즉, 위 쿼리는 해당 필드의 값이 false인 문서뿐 아니라 필드 자체가 존재하지 않는 문서까지 함께 조회합니다.
예제용 컬렉션 생성
실제 동작을 확인하기 위해 먼저 샘플 문서가 포함된 컬렉션을 만들어 보겠습니다. 직원 정보에 isOldEmployee(베테랑 직원 여부)라는 부울 필드를 포함시켰습니다.
> db.queryForBooleanFieldsDemo.insertOne({"EmployeeName":"Larry","EmployeeAge":24,"isOldEmployee":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8b7f7680f10143d8431e13")
}
> db.queryForBooleanFieldsDemo.insertOne({"EmployeeName":"Mike","EmployeeAge":20,"isOldEmployee":false});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8b7f8680f10143d8431e14")
}
> db.queryForBooleanFieldsDemo.insertOne({"EmployeeName":"Sam","EmployeeAge":23,"isOldEmployee":false});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8b7f9380f10143d8431e15")
}
> db.queryForBooleanFieldsDemo.insertOne({"EmployeeName":"David","EmployeeAge":25,"isOldEmployee":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8b7fa280f10143d8431e16")
}
> db.queryForBooleanFieldsDemo.insertOne({"EmployeeName":"Carol","EmployeeAge":27,"isOldEmployee":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8b7fae80f10143d8431e17")
}
저장된 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.queryForBooleanFieldsDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8b7f7680f10143d8431e13"),
"EmployeeName" : "Larry",
"EmployeeAge" : 24,
"isOldEmployee" : true
}
{
"_id" : ObjectId("5c8b7f8680f10143d8431e14"),
"EmployeeName" : "Mike",
"EmployeeAge" : 20,
"isOldEmployee" : false
}
{
"_id" : ObjectId("5c8b7f9380f10143d8431e15"),
"EmployeeName" : "Sam",
"EmployeeAge" : 23,
"isOldEmployee" : false
}
{
"_id" : ObjectId("5c8b7fa280f10143d8431e16"),
"EmployeeName" : "David",
"EmployeeAge" : 25,
"isOldEmployee" : true
}
{
"_id" : ObjectId("5c8b7fae80f10143d8431e17"),
"EmployeeName" : "Carol",
"EmployeeAge" : 27,
"isOldEmployee" : true
}
'true가 아닌' 문서 조회 쿼리 실행
이제 isOldEmployee 필드가 true가 아닌 문서만 조회해 보겠습니다.
> db.queryForBooleanFieldsDemo.find({isOldEmployee: {$ne: true}}).pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8b7f8680f10143d8431e14"),
"EmployeeName" : "Mike",
"EmployeeAge" : 20,
"isOldEmployee" : false
}
{
"_id" : ObjectId("5c8b7f9380f10143d8431e15"),
"EmployeeName" : "Sam",
"EmployeeAge" : 23,
"isOldEmployee" : false
}
결과를 보면 isOldEmployee 값이 false인 Mike와 Sam 두 문서만 반환된 것을 확인할 수 있습니다.
참고: 필드가 존재하는 문서만 조회하고 싶다면
$ne는 값이 false인 문서 외에 해당 필드가 아예 없는 문서도 함께 반환합니다. 필드가 반드시 존재하는 문서만 대상으로 하려면 $exists 연산자를 함께 사용하는 것이 좋습니다.
> db.queryForBooleanFieldsDemo.find({isOldEmployee: {$exists: true, $ne: true}}).pretty();
이처럼 $ne 연산자 하나만으로도 부울 필드에 대한 'not true' 조건 조회를 손쉽게 처리할 수 있습니다.