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

MongoDB에서 값이 채워진 중첩 배열을 가진 문서 찾기 및 결과 형태 변환하기

MongoDB에서 배열 필드 안에 실제 데이터가 들어 있는 문서만 골라내고 싶은 경우가 종종 있습니다. 예를 들어 중첩 배열에 빈 객체({ })가 섞여 있을 때, 값이 채워진 요소만 남기면서 결과 문서의 구조까지 원하는 형태로 바꾸려면 어떻게 해야 할까요? 이 글에서는 집계 파이프라인의 $unwind, $project, $match 단계를 활용해 이 문제를 해결하는 방법을 단계별로 살펴봅니다.

1. 샘플 컬렉션 생성하기

먼저 테스트에 사용할 컬렉션을 만들고 문서를 삽입합니다. 여기서는 demo187이라는 컬렉션을 사용하며, 일부 문서의 Details 배열에는 Subject 필드가 있는 객체가 들어 있고, 다른 문서에는 빈 객체만 들어 있도록 구성했습니다.

> db.demo187.insertOne(
...    {
...      "_id" : "101",
...      "Details" : [
...         { "Subject" : "MongoDB" },
...         { "Subject" : "MySQL" }
...    ]
...  }
...);
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo187.insertOne(
...  {
...     "_id" : "102",
...     "Details" : [
...         { }
...    ]
...  }
...);
{ "acknowledged" : true, "insertedId" : "102" }
> db.demo187.insertOne(
...  {
...     "_id" : "103",
...     "Details" : [
...         { "Subject" : "MongoDB" },
...         { "Subject" : "MySQL" }
...    ]
...  }
...);
{ "acknowledged" : true, "insertedId" : "103" }

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 한눈에 확인할 수 있습니다.

> db.demo187.find();

위 쿼리를 실행하면 다음과 같은 출력 결과가 나타납니다.

{ "_id" : "101", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ] }
{ "_id" : "102", "Details" : [ {  } ] }
{ "_id" : "103", "Details" : [ { "Subject" : "MongoDB" }, { "Subject" : "MySQL" } ] }

출력 결과를 보면 _id가 "102"인 문서의 Details 배열에는 아무 값도 없는 빈 객체만 들어 있는 것을 확인할 수 있습니다.

3. 값이 채워진 중첩 배열을 가진 문서 조회하기

값이 채워진 중첩 배열을 가진 문서만 찾으면서 동시에 결과 문서의 모양을 변경하려면 aggregate() 메서드에 다음과 같은 파이프라인 단계를 조합합니다.

  • $unwind: Details 배열의 각 요소를 개별 문서로 펼쳐서 처리 대상을 늘립니다.
  • $project: Details.Subject 값을 최상위 Subject 필드로 가져와 결과 구조를 재정의합니다.
  • $match: Subject 필드가 존재하는 문서만 남깁니다. 빈 객체에는 이 필드가 없으므로 자연스럽게 제외됩니다.
> db.demo187.aggregate([
...
...  {$unwind: '$Details'},
...
...  {$project: {Subject: '$Details.Subject'}},
...
...  {$match: {Subject: {$exists: true}}}
... ])

이 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

{ "_id" : "101", "Subject" : "MongoDB" }
{ "_id" : "101", "Subject" : "MySQL" }
{ "_id" : "103", "Subject" : "MongoDB" }
{ "_id" : "103", "Subject" : "MySQL" }

마무리 정리

$unwind로 배열을 펼친 뒤 $project로 필요한 필드만 추출하고, $match$exists 연산자를 조합하면 빈 객체는 걸러내고 값이 채워진 요소만 깔끔하게 조회할 수 있습니다. 또한 각 배열 요소가 _idSubject만 가진 평면적인 문서 형태로 변환되기 때문에, 이후 데이터 처리나 API 응답 구성에도 그대로 활용하기 좋습니다. 이 패턴은 중첩 배열 데이터를 검증하거나 정제할 때 특히 유용하게 사용할 수 있습니다.