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

MongoDB 배열 내 부분 객체 조회 방법 완벽 정리

MongoDB에서 배열 안에 저장된 객체의 일부 필드만 가지고 문서를 조회해야 하는 경우가 자주 있습니다. 이번 글에서는 배열 요소 전체가 정확히 일치해야 하는 방법과, 점 표기법(dot notation)을 활용해 부분 일치로 조회하는 두 가지 방법을 예제와 함께 살펴보겠습니다.

1. 샘플 데이터 준비하기

먼저 실습에 사용할 컬렉션을 생성하고 문서를 삽입하겠습니다. insertOne() 메서드를 사용하여 학생 정보가 담긴 배열을 포함한 문서 두 개를 추가합니다.

> db.queryForPartialObjectDemo.insertOne({_id:new ObjectId(), "StudentDetails": [{"StudentId":1, "StudentName":"Chris"}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdfcf55bf3115999ed51206")
}
> db.queryForPartialObjectDemo.insertOne({_id:new ObjectId(), "StudentDetails": [{"StudentId":2, "StudentName":"David"}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cdfcf55bf3115999ed51207")
}

데이터가 정상적으로 들어갔는지 확인하기 위해 find() 메서드와 pretty() 메서드를 함께 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

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

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5cdfcf55bf3115999ed51206"),
   "StudentDetails" : [
      {
         "StudentId" : 1,
         "StudentName" : "Chris"
      }
   ]
}
{
   "_id" : ObjectId("5cdfcf55bf3115999ed51207"),
   "StudentDetails" : [
      {
         "StudentId" : 2,
         "StudentName" : "David"
      }
   ]
}

방법 1: 객체 전체를 조건으로 지정

배열 요소를 직접 조건으로 지정하는 첫 번째 방법입니다. 이 방식은 배열 내 객체의 모든 필드가 정확히 일치해야만 문서가 검색됩니다.

> db.queryForPartialObjectDemo.find({StudentDetails: {StudentId: 1, "StudentName" : "Chris"}});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5cdfcf55bf3115999ed51206"), "StudentDetails" : [ { "StudentId" : 1, "StudentName" : "Chris" } ] }

주의할 점은, 만약 {StudentDetails: {StudentName: "Chris"}}처럼 필드 하나만 지정하면 아무런 결과도 반환되지 않습니다. MongoDB는 배열 요소를 객체 단위로 비교하기 때문에 객체 구조 전체가 일치해야 하기 때문입니다.

방법 2: 점 표기법(Dot Notation) 활용

배열 내 객체의 특정 필드 값만으로 조회하고 싶다면 점 표기법을 사용하는 것이 좋습니다. "배열필드명.객체내부필드명" 형태로 조건을 작성하면 해당 필드 값이 일치하는 모든 문서를 손쉽게 찾을 수 있습니다.

> db.queryForPartialObjectDemo.find({"StudentDetails.StudentName":"Chris"});

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5cdfcf55bf3115999ed51206"), "StudentDetails" : [ { "StudentId" : 1, "StudentName" : "Chris" } ] }

마무리

정리하면 다음과 같습니다.

  • 객체 전체 일치 조회: 배열 요소의 모든 필드가 순서와 값까지 정확히 일치해야 합니다.
  • 점 표기법 조회: 배열 내 객체의 특정 필드 값만으로도 유연하게 검색할 수 있어 실무에서 더 널리 사용됩니다.

배열 내 중첩된 객체를 다룰 때는 대부분 점 표기법을 활용하는 것이 효율적이며, 필요에 따라 $elemMatch 연산자를 함께 사용하면 더욱 복잡한 조건의 조회도 가능합니다.