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

MongoDB 객체 배열에서 _id로 문서 찾기 – $unwind와 $match 집계 파이프라인 활용법

MongoDB 객체 배열에서 _id로 문서 찾기

MongoDB에서 객체 배열(array of objects) 내부의 데이터를 조회할 때는 find() 대신 집계(Aggregation) 파이프라인을 사용하는 것이 좋습니다. 이 글에서는 $unwind$match 단계를 조합하여 배열 안의 특정 객체를 정확하게 추출하는 방법을 예제와 함께 살펴봅니다.

1단계: 샘플 컬렉션 생성

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입합니다.

> db.demo414.insertOne(
...    {
...       "_id": "110",
...       "details":[
...          {
...             "StudentName":"John",
...             "StudentMarks":56
...          },
...          {
...             "StudentName":"Robert",
...             "StudentMarks":98
...          }
...      ]
...    }
... );
{ "acknowledged" : true, "insertedId" : "110" }

문서가 성공적으로 저장되면 위와 같이 acknowledged : true와 함께 삽입된 _id 값이 반환됩니다.

2단계: 전체 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 봅니다.

> db.demo414.find();

이 쿼리는 다음과 같은 결과를 생성합니다.

{ "_id" : "110", "details" : [ { "StudentName" : "John", "StudentMarks" : 56 }, { "StudentName" : "Robert", "StudentMarks" : 98 } ] }

details 필드에 두 명의 학생 정보가 배열 형태로 저장되어 있는 것을 확인할 수 있습니다.

3단계: 집계 파이프라인으로 배열 내 객체 검색

객체 배열에서 조건에 맞는 요소만 추출하려면 먼저 $unwind로 배열을 개별 문서로 분해한 뒤, $match로 원하는 조건을 필터링합니다.

> db.demo414.aggregate([{$unwind: "$details"}, {$match:{"details.StudentMarks" :56}}] )

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

{ "_id" : "110", "details" : { "StudentName" : "John", "StudentMarks" : 56 } }

배열 전체가 아닌 StudentMarks가 56인 객체 하나만 깔끔하게 반환된 것을 볼 수 있습니다.

마무리 정리

  • $unwind: 배열 필드를 요소별로 하나의 문서로 분해합니다.
  • $match: 분해된 문서 중 조건에 일치하는 것만 걸러냅니다.
  • find()로 배열 내부를 검색하면 조건과 일치하는 요소가 있어도 배열 전체가 반환되므로, 특정 객체만 필요하다면 집계 파이프라인을 사용하는 것이 훨씬 효율적입니다.