MongoDB에서 특정 속성을 기준으로 객체 목록을 조회하고 싶다면, find() 메서드에 점 표기법(dot notation)을 사용하면 됩니다. 이번 글에서는 실제 예제를 바탕으로 그 과정을 단계별로 정리해 보았습니다.
1. 샘플 데이터 생성
먼저 문서를 담고 있는 컬렉션을 생성합니다. 아래 예제에서 각 문서는 Information.Student라는 배열 구조로 되어 있으며, 배열의 요소마다 학생의 Name(이름)과 Age(나이) 정보가 저장되어 있습니다.
> db.demo455.insertOne({"Information":{"Student":[{"Name":"Chris","Age":22}]}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e7e1876dbcb9adb296c95c5")
}
> db.demo455.insertOne({"Information":{"Student":[{"Name":"David","Age":21}]}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e7e1883dbcb9adb296c95c6")
}
> db.demo455.insertOne({"Information":{"Student":[{"Name":"Bob","Age":24}]}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e7e188adbcb9adb296c95c7")
}
> db.demo455.insertOne({"Information":{"Student":[{"Name":"Robert","Age":21}]}});{
"acknowledged" : true,
"insertedId" : ObjectId("5e7e18bcdbcb9adb296c95c8")
}
2. 저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 한눈에 확인할 수 있습니다.
> db.demo455.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e7e1876dbcb9adb296c95c5"), "Information" : { "Student" : [ { "Name" :
"Chris", "Age" : 22 } ] } }
{ "_id" : ObjectId("5e7e1883dbcb9adb296c95c6"), "Information" : { "Student" : [ { "Name" :
"David", "Age" : 21 } ] } }
{ "_id" : ObjectId("5e7e188adbcb9adb296c95c7"), "Information" : { "Student" : [ { "Name" :
"Bob", "Age" : 24 } ] } }
{ "_id" : ObjectId("5e7e18bcdbcb9adb296c95c8"), "Information" : { "Student" : [ { "Name" :
"Robert", "Age" : 21 } ] } }
3. 특정 속성으로 객체 목록 조회하기
여기서 핵심은 점 표기법입니다. "Information.Student.Age"처럼 경로를 지정하면 배열 내부에 중첩된 속성 값도 조회 조건으로 활용할 수 있습니다. 아래 쿼리는 나이(Age)가 21인 학생이 포함된 문서만 가져옵니다.
> db.demo455.find({"Information.Student.Age":21});
실행 결과를 보면 나이가 21인 David와 Robert의 문서 두 건만 반환된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e7e1883dbcb9adb296c95c6"), "Information" : { "Student" : [ { "Name" :
"David", "Age" : 21 } ] } }
{ "_id" : ObjectId("5e7e18bcdbcb9adb296c95c8"), "Information" : { "Student" : [ { "Name" :
"Robert", "Age" : 21 } ] } }
이처럼 MongoDB의 점 표기법을 활용하면 중첩된 배열이나 객체 내부의 특정 속성 값을 기준으로 손쉽게 데이터를 필터링할 수 있습니다. 참고로 해당 필드에 멀티키(multikey) 인덱스를 생성해 두면 대량의 데이터를 다룰 때도 빠른 조회 성능을 기대할 수 있습니다.