MongoDB 정확한 일치(Exact Match) 쿼리 개요
MongoDB에서 특정 필드의 값이 배열이 아닌 단일 값으로 정확히 일치하는 문서만 조회하고 싶을 때가 있습니다. 이럴 때는 $exists 연산자를 활용하면 됩니다. $exists는 해당 필드(또는 배열 인덱스)의 존재 여부를 확인하는 연산자입니다.
예제를 위해 먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo290.insertOne({"ListOfName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4c0c9e5d93261e4bc9ea2d")
}
> db.demo290.insertOne({"ListOfName":["Chris","David"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4c0cb05d93261e4bc9ea2e")
}위 예제에서 첫 번째 문서는 ListOfName 필드에 문자열 값 "Chris"를 가지고 있고, 두 번째 문서는 동일한 필드에 ["Chris", "David"]라는 배열을 가지고 있습니다.
find() 메서드로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo290.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e4c0c9e5d93261e4bc9ea2d"), "ListOfName" : "Chris" }
{ "_id" : ObjectId("5e4c0cb05d93261e4bc9ea2e"), "ListOfName" : [ "Chris", "David" ] }정확한 값 일치를 위한 쿼리 작성
이제 문자열 "Chris"가 정확히 일치하는 문서만 조회하는 쿼리를 살펴보겠습니다.
> db.demo290.find({$and: [{'ListOfName.0': {$exists: false}}, {"ListOfName": 'Chris'}]});위 쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : ObjectId("5e4c0c9e5d93261e4bc9ea2d"), "ListOfName" : "Chris" }쿼리 동작 원리
이 쿼리가 어떻게 동작하는지 자세히 살펴보겠습니다.
'ListOfName.0': {$exists: false}: 배열의 첫 번째 요소 인덱스(.0)가 존재하지 않는지 확인합니다. 만약 필드가 배열이라면 인덱스 0이 반드시 존재하므로, 이 조건은 해당 필드가 배열이 아닌 경우에만 참이 됩니다.{"ListOfName": 'Chris'}: 필드 값이 "Chris"와 일치하는지 확인합니다.$and: 두 조건을 모두 만족하는 문서만 반환합니다.
그 결과, 값이 "Chris"인 단일 문자열을 가진 첫 번째 문서만 조회되고, 배열을 포함한 두 번째 문서는 제외됩니다. MongoDB는 기본적으로 배열 내 요소와도 매칭을 시도하기 때문에, 배열 형태의 데이터를 제외하고 순수한 스칼라 값만 조회하려면 이처럼 $exists 조건을 함께 사용하는 것이 효과적입니다.