MongoDB에서 배열 안에 포함된 하위 문서(내장 문서)의 필드 값을 기준으로 문서를 조회하려면 find() 메서드와 함께 점 표기법(dot notation)을 사용하면 됩니다. 점 표기법은 "배열필드명.하위필드명" 형태로 작성하여 배열 내부의 중첩된 문서에 직접 접근할 수 있게 해줍니다.
1. 샘플 컬렉션 생성하기
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 각 문서는 details라는 배열을 가지고 있으며, 이 배열 안에는 이름과 과목 정보를 담은 여러 개의 내장 문서가 들어 있습니다.
> db.demo465.insertOne(
... {
... id: 101,
... details: [{
... Name: "Chris",
... Info: {
... Subject: "MongoDB",
... Marks: 67
... }
... }, {
... Name: "David",
... Info: {
... Subject: "MySQL",
... Marks: 78
... }
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e80421bb0f3fa88e2279061")
}
>
> db.demo465.insertOne(
... {
... id: 102,
... details: [{
... Name: "Bob",
... Info: {
... Subject: "Java",
... Marks: 45
... }
... }, {
... Name: "Carol",
... Info: {
... Subject: "C",
... Marks: 67
... }
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e80421cb0f3fa88e2279062")
}2. 컬렉션의 전체 문서 확인하기
find() 메서드를 인자 없이 호출하면 컬렉션에 저장된 모든 문서를 출력할 수 있습니다.
> db.demo465.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e80421bb0f3fa88e2279061"), "id" : 101, "details" : [ { "Name" : "Chris", "Info" : { "Subject" : "MongoDB", "Marks" : 67 } }, { "Name" : "David", "Info" : { "Subject" : "MySQL", "Marks" : 78 } } ] }
{ "_id" : ObjectId("5e80421cb0f3fa88e2279062"), "id" : 102, "details" : [ { "Name" : "Bob", "Info" : { "Subject" : "Java", "Marks" : 45 } }, { "Name" : "Carol", "Info" : { "Subject" : "C", "Marks" : 67 } } ] }3. 배열 내 특정 문서를 포함하는 문서 조회하기
이제 핵심 질의입니다. details 배열 안에 Name이 "Bob"인 내장 문서를 가진 모든 문서를 찾으려면 아래와 같이 점 표기법을 활용한 조건을 find()에 전달합니다.
> db.demo465.find({"details.Name":"Bob"});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e80421cb0f3fa88e2279062"), "id" : 102, "details" : [ { "Name" : "Bob", "Info" : { "Subject" : "Java", "Marks" : 45 } }, { "Name" : "Carol", "Info" : { "Subject" : "C", "Marks" : 67 } } ] }정리
결과를 보면 id가 102인 문서만 반환된 것을 확인할 수 있습니다. MongoDB는 "details.Name"이라는 점 표기법 조건을 만족하는 요소가 배열 어디에든 하나라도 존재하면 해당 문서 전체를 결과로 반환합니다. 이 방식은 별도의 연산자 없이 간단하게 배열 내 내장 문서를 검색할 수 있는 가장 기본적이면서도 널리 사용되는 방법입니다. 참고로 조건에 일치하는 배열 요소만 추출하고 싶다면 $elemMatch나 집계 파이프라인의 $filter를 함께 활용하는 것도 좋은 선택입니다.