MongoDB에서 필드의 존재 여부를 조건으로 레코드를 조회하려면 $or 연산자와 함께 $exists 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 두 연산자를 조합하여 원하는 문서만 효율적으로 가져오는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 데모용 컬렉션을 만들고 문서를 삽입합니다. 아래 예제에서는 세 개의 문서를 추가하며, 그중 일부 문서에는 Subjects 필드가 있고 일부에는 없습니다.
> db.demo185.insertOne({_id:101, details:{Name:"Chris", Score:78, Subjects:{"Name":"MySQL"}}});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo185.insertOne({_id:102, details:{Name:"Bob", Score:78}});
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo185.insertOne({_id:103, details:{Name:"David", Score:78, Subjects:{"Name":"MongoDB"}}});
{ "acknowledged" : true, "insertedId" : 103 }2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo185.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 101, "details" : { "Name" : "Chris", "Score" : 78, "Subjects" : { "Name" : "MySQL" } } }
{ "_id" : 102, "details" : { "Name" : "Bob", "Score" : 78 } }
{ "_id" : 103, "details" : { "Name" : "David", "Score" : 78, "Subjects" : { "Name" : "MongoDB" } } }출력 결과를 보면 _id: 102인 Bob의 문서에는 details.Subjects.Name 필드가 존재하지 않는 것을 알 수 있습니다.
3. $or와 $exists를 조합한 쿼리 작성하기
이제 특정 필드가 존재하는 문서만 조회하는 쿼리를 작성해 보겠습니다. $or 배열 안에 $exists: true 조건을 넣어 해당 필드의 존재 여부를 검사합니다.
> db.demo185.find({
... "$or": [
... { "details.Subjects.Name": { "$exists": true } },
... { "details.Subjects.Name": { "$exists": true } }
... ]
... })위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 101, "details" : { "Name" : "Chris", "Score" : 78, "Subjects" : { "Name" : "MySQL" } } }
{ "_id" : 103, "details" : { "Name" : "David", "Score" : 78, "Subjects" : { "Name" : "MongoDB" } } }결과 분석
출력 결과를 보면 details.Subjects.Name 필드가 존재하는 문서(_id: 101, _id: 103)만 반환된 것을 확인할 수 있습니다. 필드가 없는 _id: 102 문서는 결과에서 제외되었습니다.
참고 사항
이 예제에서는 $or 배열에 동일한 조건이 두 번 들어가 있습니다. 실제로는 하나의 조건만으로도 동일한 결과를 얻을 수 있습니다. $or 연산자는 여러 조건 중 하나라도 만족하면 해당 문서를 반환하므로, 서로 다른 여러 필드의 존재 여부를 OR 조건으로 검사할 때 유용합니다. 예를 들어 { "details.Subjects": { "$exists": true } } 또는 { "details.Address": { "$exists": true } }처럼 서로 다른 필드를 조합할 수 있습니다.