MongoDB에서는 객체 내부에 배열이 포함된 구조도 점 표기법(dot notation)을 활용하면 손쉽게 조회할 수 있습니다. 이번 글에서는 중첩된 객체 안의 배열 필드를 대상으로 쿼리를 수행하는 방법을 예제와 함께 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 demo194라는 컬렉션을 만들고 문서를 삽입합니다. 각 문서는 details.otherDetails 객체 안에 여러 개의 배열(List1, List2, List3)을 포함하고 있습니다.
> db.demo194.insertOne(
... {
... "_id": 101,
... "details": {
... "otherDetails": {
... "List1": ["MongoDB", "MySQL"],
... "List2": ["Java"],
... "List3": ["MongoDB", "C"]
... }
... }
... }
...);
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo194.insertOne( {"_id": 102, "details": { "otherDetails": { "List1": ["Java", "C"], "List2": ["C++"], "List3": ["Python", "Spring"] } } } );
{ "acknowledged" : true, "insertedId" : 102 }위 명령은 두 개의 문서(ID 101, 102)를 성공적으로 삽입했다는 것을 보여줍니다.
2. find() 메서드로 전체 문서 확인하기
삽입된 모든 문서를 확인하려면 find() 메서드를 사용합니다.
> db.demo194.find();
실행 결과는 다음과 같습니다.
{ "_id" : 101, "details" : { "otherDetails" : { "List1" : [ "MongoDB", "MySQL" ], "List2" : [ "Java" ], "List3" : [ "MongoDB", "C" ] } } }
{ "_id" : 102, "details" : { "otherDetails" : { "List1" : [ "Java", "C" ], "List2" : [ "C++" ], "List3" : [ "Python", "Spring" ] } } }3. 배열 객체 쿼리하기
이제 핵심인 배열 객체 쿼리 방법입니다. MongoDB에서는 경로를 점(.)으로 연결하여 중첩된 필드에 접근할 수 있습니다. 아래 쿼리는 details.otherDetails.List1 배열 안에 "MongoDB" 값이 포함된 문서만 조회합니다.
> db.demo194.find({ "details.otherDetails.List1": "MongoDB" })실행 결과는 다음과 같습니다.
{ "_id" : 101, "details" : { "otherDetails" : { "List1" : [ "MongoDB", "MySQL" ], "List2" : [ "Java" ], "List3" : [ "MongoDB", "C" ] } } }결과 분석
문서 101의 List1 배열에는 "MongoDB"가 포함되어 있으므로 조회 결과에 나타났습니다. 반면 문서 102의 List1은 ["Java", "C"]로 "MongoDB"를 포함하지 않기 때문에 결과에서 제외되었습니다.
참고로 MongoDB에서 이런 방식으로 배열 필드를 쿼리하면, 배열 전체가 정확히 일치하는 경우뿐 아니라 배열의 요소 중 하나라도 조건과 일치하면 해당 문서를 반환합니다. 특정 위치의 배열 요소를 조회하려면 $elemMatch 연산자나 인덱스 기반 접근(예: List1.0)을 활용할 수 있습니다.