MongoDB에서 하위 문서(sub-document)에 포함된 필드를 조회하려면 점 표기법(dot notation)을 사용해야 합니다. 점 표기법은 상위 필드와 하위 필드를 마침표(.)로 연결하여 중첩된 데이터에 접근하는 방식입니다.
1. 샘플 컬렉션 생성하기
먼저 하위 문서를 포함하는 문서들을 담은 컬렉션을 생성하겠습니다. insertOne() 메서드를 사용하여 세 개의 문서를 삽입합니다.
> db.demo537.insertOne({"details":{"SubjectName":"MongoDB"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8c8a10ef4dcbee04fbbc05")
}
> db.demo537.insertOne({"details":{"SubjectName":"MySQL"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8c8a4bef4dcbee04fbbc06")
}
> db.demo537.insertOne({"details":{"SubjectName":"Java"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8c8a51ef4dcbee04fbbc07")
}
각 문서는 details라는 상위 필드 안에 SubjectName이라는 하위 필드를 가지고 있습니다. 이처럼 중첩된 구조가 바로 하위 문서입니다.
2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션 내의 모든 문서를 조회할 수 있습니다.
> db.demo537.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e8c8a10ef4dcbee04fbbc05"), "details" : { "SubjectName" : "MongoDB" } }
{ "_id" : ObjectId("5e8c8a4bef4dcbee04fbbc06"), "details" : { "SubjectName" : "MySQL" } }
{ "_id" : ObjectId("5e8c8a51ef4dcbee04fbbc07"), "details" : { "SubjectName" : "Java" } }
3. 점 표기법으로 하위 문서 쿼리 실행하기
이제 핵심 단계입니다. 하위 문서의 특정 필드 값을 조건으로 조회하려면 'details.SubjectName'처럼 점 표기법을 활용합니다. 아래 예시는 SubjectName이 'MongoDB'인 문서의 개수를 세는 쿼리입니다.
> db.demo537.count({'details.SubjectName': 'MongoDB'})
실행 결과는 다음과 같습니다.
1
결과값 1은 조건에 일치하는 문서가 정확히 하나 존재한다는 의미입니다.
참고: count() 대신 countDocuments() 사용 권장
MongoDB 최신 버전에서는 count() 메서드가 deprecated(사용 중단 예정)되었으므로, 더 정확한 결과를 보장하는 countDocuments() 사용을 권장합니다.
> db.demo537.countDocuments({'details.SubjectName': 'MongoDB'})
또한 조건에 일치하는 전체 문서를 반환하고 싶다면 find() 메서드에 동일한 조건을 적용하면 됩니다.
> db.demo537.find({'details.SubjectName': 'MongoDB'}).pretty();
정리
- 하위 문서 필드에 접근할 때는 점 표기법('상위필드.하위필드')을 사용합니다.
find(),count(),countDocuments()등 모든 쿼리 메서드에서 점 표기법을 활용할 수 있습니다.- 따옴표로 감싼 문자열 형태('details.SubjectName')로 작성해야 올바르게 인식됩니다.