MongoDB에서 특정 필드를 가진 문서나 임베디드(내장) 문서의 존재 여부를 확인하려면 $exists 연산자를 사용하면 됩니다. 이 연산자는 지정한 필드가 문서 내에 실제로 존재하는지 여부에 따라 true 또는 false를 반환하므로, 배열 형태의 임베디드 문서 안에 특정 키가 있는지 검사할 때도 매우 유용합니다.
1. 샘플 컬렉션 생성
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 아래 예시에서는 demo322라는 컬렉션에 두 개의 문서를 추가합니다. 첫 번째 문서의 details 배열에는 Name 필드가 포함되어 있고, 두 번째 문서에는 Score 필드만 존재합니다.
> db.demo322.insertOne(
... {'id':1001,
... 'details':[{'Score':10000,Name:"Bob"},
... {'Score':98000,Name:"Sam"}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5113e2f8647eb59e56206c")
}
> db.demo322.insertOne(
... {'id':10002,
... 'details':[{'Score':9000},
... {'Score':91000}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5113faf8647eb59e56206d")
}위 명령을 실행하면 각각의 insertOne() 호출이 성공적으로 처리되었음을 알 수 있습니다.
2. find() 메서드로 전체 문서 조회하기
삽입된 모든 문서를 확인하려면 find() 메서드를 사용합니다.
> db.demo322.find();
이 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e5113e2f8647eb59e56206c"), "id" : 1001, "details" : [
{ "Score" : 10000, "Name" : "Bob" }, { "Score" : 98000, "Name" : "Sam" }
]
}
{
"_id" : ObjectId("5e5113faf8647eb59e56206d"), "id" : 10002, "details" : [
{ "Score" : 9000 }, { "Score" : 91000 }
]
}결과를 보면 첫 번째 문서의 임베디드 문서에는 Name 필드가 있지만, 두 번째 문서에는 없다는 것을 확인할 수 있습니다.
3. $exists로 임베디드 문서 존재 여부 확인하기
이제 점 표기법(dot notation)과 함께 $exists 연산자를 사용하여 details 배열 안에 Name 필드를 가진 임베디드 문서가 존재하는지 확인해 보겠습니다.
> db.demo322.find({"details.Name":{$exists:true}}).count() > 0;이 쿼리는 다음과 같은 결과를 반환합니다.
True
정리
{"details.Name": {$exists: true}} 조건은 details 배열 내 어느 하나의 임베디드 문서라도 Name 필드를 포함하고 있는 경우 해당 문서를 매칭합니다. 여기에 .count() > 0을 결합하면 일치하는 문서가 하나 이상 존재하는지 불리언(Boolean) 값으로 손쉽게 판단할 수 있습니다. 반대로 $exists: false를 사용하면 해당 필드가 없는 문서만 조회할 수 있으므로, 데이터 검증이나 조건부 집계 작업에 폭넓게 활용할 수 있습니다.