MongoDB에서 필드가 빈 배열([]) 또는 빈 객체({})인지 확인하는 방법
MongoDB를 다루다 보면 특정 필드의 값이 빈 배열([])이거나 빈 객체({})인지, 아니면 실제 데이터가 들어 있는지 판단해야 하는 경우가 자주 있습니다. 이 글에서는 $gt 연산자와 $exists 연산자를 조합해 이를 확인하는 방법을 예제와 함께 단계별로 살펴보겠습니다.
1. 기본 문법
필드가 [] 또는 {}인지 확인하려면 다음과 같은 형식의 쿼리를 사용합니다.
db.컬렉션이름.find({
"상위필드명": { "$gt": {} },
"상위필드명.0": { "$exists": false }
});
각 조건이 수행하는 역할은 다음과 같습니다.
- "$gt": {} — BSON 비교 순서에서 빈 객체보다 큰 값만 매칭합니다. 따라서 값이 정확히 빈 객체({})인 문서는 제외됩니다.
- "필드명.0": { "$exists": false } — 배열은 항상 0번 인덱스 요소를 가지므로, 이 조건은 필드가 배열이 아닌 경우만 남깁니다.
두 조건을 결합하면 빈 배열, 빈 객체, null, 존재하지 않는 필드는 모두 걸러지고, 실제 내용을 담고 있는 객체 필드만 결과로 반환됩니다.
2. 예제 컬렉션 생성
먼저 테스트용 컬렉션을 만들고 다양한 형태의 값을 가진 문서를 삽입해 보겠습니다.
> db.checkFieldDemo.insert([
... { _id: 1010, StudentDetails: {} },
... { _id: 1011, StudentDetails: [ { StudentId: 1 } ] },
... { _id: 1012, StudentDetails: [ {} ] },
... { _id: 1013 },
... { _id: 1014, StudentDetails: null },
... { _id: 1015, StudentDetails: { StudentId: 1 } }
... ]);
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 6,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
6개의 문서가 오류 없이 정상적으로 삽입되었습니다. 각 문서는 서로 다른 형태의 StudentDetails 값을 가지고 있어 테스트에 적합합니다.
3. 전체 문서 조회하기
find() 메서드에 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.checkFieldDemo.find().pretty();
실행 결과는 다음과 같습니다.
{ "_id" : 1010, "StudentDetails" : { } }
{ "_id" : 1011, "StudentDetails" : [ { "StudentId" : 1 } ] }
{ "_id" : 1012, "StudentDetails" : [ { } ] }
{ "_id" : 1013 }
{ "_id" : 1014, "StudentDetails" : null }
{ "_id" : 1015, "StudentDetails" : { "StudentId" : 1 } }
4. 필드 확인 쿼리 실행하기
이제 앞서 소개한 문법을 실제 데이터에 적용해 StudentDetails 필드를 검사해 보겠습니다.
> db.checkFieldDemo.find({
... "StudentDetails": { "$gt": {} },
... "StudentDetails.0": { "$exists": false }
... });
실행 결과는 다음과 같습니다.
{ "_id" : 1015, "StudentDetails" : { "StudentId" : 1 } }
5. 결과 분석
결과에는 _id가 1015인 문서 하나만 포함되었습니다. 나머지 문서가 제외된 이유는 다음과 같습니다.
- 1010 —
StudentDetails가 빈 객체({})이므로 "$gt": {} 조건을 만족하지 못합니다. - 1011, 1012 — 값이 배열이므로 0번 인덱스가 존재해 "$exists": false 조건에서 제외됩니다.
- 1013 —
StudentDetails필드 자체가 없어 매칭 대상에서 제외됩니다. - 1014 — 값이 null이며, BSON 비교 순서에서 null은 객체보다 작아 "$gt": {} 조건을 통과하지 못합니다.
- 1015 — 키를 가진 일반 객체이면서 배열이 아니므로 두 조건을 모두 충족합니다.
이처럼 $gt와 $exists 연산자를 조합하면 필드가 빈 구조([] 또는 {})인지, null인지, 아니면 실제 데이터를 담고 있는지 명확하게 구분할 수 있습니다. 데이터 정합성 점검이나 스키마 마이그레이션 작업 시 유용하게 활용할 수 있는 패턴이니 참고하시기 바랍니다.