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

MongoDB 객체 내부 배열에서 데이터를 찾는 쿼리 방법

MongoDB에서는 도큐먼트(document) 내부에 중첩된 객체와 배열이 자주 사용됩니다. 이때 점 표기법(dot notation)을 활용하면 객체 안에 있는 배열의 특정 값을 손쉽게 검색할 수 있습니다. 이번 글에서는 객체 내부의 배열에서 데이터를 찾는 MongoDB 쿼리 작성 방법을 예제와 함께 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용해 컬렉션을 생성하고 도큐먼트를 삽입합니다. 아래 예제에서는 고객 정보 객체(CustomerDetails) 안에 국가명과 결혼 여부가 각각 배열 형태로 저장되어 있습니다.

> db.findDataDemo.insertOne(
    {
       "_id": new ObjectId(),
       "CustomerName": "John",
       "CustomerDetails" : {
          "CountryName" : [
             "AUS"
          ],
          "isMarried" : [
             false
          ]
       }
    }
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefa5eeef71edecf6a1f6a5")
}

두 번째 도큐먼트도 같은 방식으로 추가합니다.

> db.findDataDemo.insertOne(
    {
       "_id": new ObjectId(),
       "CustomerName": "Carol",
       "CustomerDetails" : {
          "CountryName" : [
             "UK"
          ],
          "isMarried" : [
             true
          ]
       }
    }
);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefa60aef71edecf6a1f6a6")
}

2. 전체 도큐먼트 확인하기

find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 도큐먼트를 보기 좋게 출력할 수 있습니다.

> db.findDataDemo.find().pretty();

출력 결과

{
   "_id" : ObjectId("5cefa5eeef71edecf6a1f6a5"),
   "CustomerName" : "John",
   "CustomerDetails" : {
      "CountryName" : [
         "AUS"
      ],
      "isMarried" : [
         false
      ]
   }
}
{
   "_id" : ObjectId("5cefa60aef71edecf6a1f6a6"),
   "CustomerName" : "Carol",
   "CustomerDetails" : {
      "CountryName" : [
         "UK"
      ],
      "isMarried" : [
         true
      ]
   }
}

3. 객체 내부 배열에서 데이터 조회하는 쿼리

핵심은 점 표기법입니다. "상위필드.하위필드" 형태로 경로를 지정하면, MongoDB는 해당 경로가 배열이더라도 배열 요소 중 일치하는 값이 있는지 자동으로 확인합니다.

예를 들어, CountryName 배열에 "UK"가 포함된 고객을 찾으려면 다음과 같이 쿼리를 작성합니다.

> db.findDataDemo.find({"CustomerDetails.CountryName":"UK"});

출력 결과

{ "_id" : ObjectId("5cefa60aef71edecf6a1f6a6"), "CustomerName" : "Carol", "CustomerDetails" : { "CountryName" : [ "UK" ], "isMarried" : [ true ] } }

정리

이처럼 MongoDB에서는 별도의 연산자 없이 { "객체명.배열필드": 값 } 형태의 조건만으로 객체 내부 배열의 데이터를 간단히 검색할 수 있습니다. 만약 배열 안에 객체(서브도큐먼트)가 들어 있는 경우에는 $elemMatch 연산자를 활용하면 더욱 정교한 조건 검색이 가능하니, 상황에 맞게 함께 활용해 보시기 바랍니다.