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()로 배열 내부를 검색하면 조건과 일치하는 요소가 있어도 배열 전체가 반환되므로, 특정 객체만 필요하다면 집계 파이프라인을 사용하는 것이 훨씬 효율적입니다.