Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 배열 객체를 쿼리하는 방법 완벽 가이드

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)을 활용할 수 있습니다.