AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.

unwind (집계 단계)

$unwind

입력 문서에서 배열 필드를 분해해 각 요소에 대한 문서를 출력합니다. 각 출력 문서는 배열 필드의 값이 요소로 대체된 입력 문서입니다.

다음 환경에서 호스팅되는 배포에 $unwind 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

필드 경로 피연산자 또는 문서 피연산자를 전달하여 배열 필드를 해제합니다.

$unwind에 배열 필드 경로를 전달할 수 있습니다. 이 구문을 사용할 때 $unwind은(는) 필드 값이 null이거나 누락되었거나 빈 배열인 경우 문서를 출력하지 않습니다.

{ $unwind: <field path> }

필드 경로를 지정할 때 필드 이름 앞에 달러 기호 $를 붙이고 따옴표로 묶습니다.

$unwind에 문서를 전달하여 옵션을 지정할 수 있습니다.

{ $unwind: { path: <field path>, includeArrayIndex: <string>, preserveNullAndEmptyArrays: <boolean> }}
필드
유형
설명

문자열

배열 필드의 필드 경로입니다. 필드 경로를 지정하려면 필드 이름 앞에 달러 기호 $를 붙이고 따옴표로 묶습니다.

문자열

선택 사항. 요소의 배열 인덱스를 저장할 새 필드의 이름입니다. 이름은 달러 기호 $로 시작할 수 없습니다.

부울

선택 사항.

  • true, path 이 누락되었거나 빈 배열 인 경우 $unwind 는 출력 문서 에서 출력 필드 생략합니다. 값이 null인 경우 필드 null로 유지됩니다.

  • false, path 이 null이거나 누락되었거나 빈 배열 인 경우 $unwind 는 문서 출력하지 않습니다.

기본값은 false입니다.

path 의 값이 배열 로 해석되지 않으면 $unwind 은 다음과 같이 동작합니다.

  • 값이 누락되지 않았거나 null이 아니며 빈 배열 아닌 경우 $unwind 는 값을 있는 그대로 사용하여 단일 문서 출력합니다.

  • includeArrayIndex 를 지정하면 배열 입력의 경우 인덱스 가 0, 비배열 입력의 경우 null 가 됩니다. 목록의 뒷부분에 있는 문서의 인덱스 가 0보다 큽니다.

  • 값이 누락되었거나 null이거나 빈 배열 인 경우 $unwind 은 preserveNullAndEmptyArrays 옵션 뒤에 옵니다. includeArrayIndex 가 지정되고 문서 보존되는 경우 인덱스 는 null입니다.

입력 문서에 존재하지 않는 필드의 경로를 지정하거나 필드가 빈 배열인 경우 $unwind은 기본적으로 입력 문서를 무시하고 해당 입력 문서에 대한 문서를 출력하지 않습니다.

배열 필드가 누락되었거나, 널 또는 빈 배열이 있는 문서를 출력하려면 preserveNullAndEmptyArrays 옵션을 사용합니다.

이 페이지의 예시는 sample_mflix 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB 배포서버에 로드하는 방법에 대한 자세한 내용은 샘플 데이터세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우, 이 페이지의 예시를 실행하려면 데이터베이스를 제거하고 다시 생성해야 할 수 있습니다.

다음 집계는 $unwind 단계를 사용하여 Inception 영화 문서의 genres 배열에 있는 각 요소에 대한 문서를 출력합니다.

db.movies.aggregate( [ { $match: { title: "Inception" } }, { $project: { _id: 0, title: 1, genres: 1 } }, { $unwind: "$genres" }] )
[ { genres: 'Action', title: 'Inception' }, { genres: 'Mystery', title: 'Inception' }, { genres: 'Sci-Fi', title: 'Inception' }]

각 출력 문서는 이제 원래 genres 배열의 단일 요소를 보유하는 genres 필드의 값을 제외하고 입력 문서와 동일합니다.

다음 집계는 4개의 영화 문서와 함께 $unwind 단계를 사용합니다. 문서 중 2개("La porta del cielo" 및 "Neecha Nagar")에는 genres 필드가 없습니다.

db.movies.aggregate( [ { $match: { title: { $in: [ "Inception", "Brave", "La porta del cielo", "Neecha Nagar" ] } } }, { $project: { _id: 0, title: 1, genres: 1 } }, { $unwind: { path: "$genres" } }] )
[ { genres: 'Animation', title: 'Brave' }, { genres: 'Adventure', title: 'Brave' }, { genres: 'Comedy', title: 'Brave' }, { genres: 'Action', title: 'Inception' }, { genres: 'Mystery', title: 'Inception' }, { genres: 'Sci-Fi', title: 'Inception' }]
  • "Brave" 및 "Inception" 문서에서 genres는 채워진 배열입니다. $unwind은 각 요소에 대한 문서를 반환합니다.

  • "La porta del cielo" 및 "Neecha Nagar" 문서에는 genres 필드가 없으므로 $unwind은(는) 해당 문서에 대해 아무것도 반환하지 않습니다.

참고

{ path: <FIELD> } 구문은 선택 사항입니다. 다음 $unwind 작업은 동일합니다.

db.<COLLECTION>.aggregate( [ { $unwind: "<FIELD>" } ])
db.<COLLECTION>.aggregate( [ { $unwind: { path: "<FIELD>" } } ])

preserveNullAndEmptyArrays 및 includeArrayIndex 예시에서는 sample_mflix.movies 컬렉션의 문서를 사용합니다.

다음 $unwind 작업은 preserveNullAndEmptyArrays 옵션을 사용하여 genres 필드가 누락된 문서를 포함합니다.

db.movies.aggregate( [ { $match: { title: { $in: [ "Inception", "Brave", "La porta del cielo", "Neecha Nagar" ] } } }, { $project: { _id: 0, title: 1, genres: 1 } }, { $unwind: { path: "$genres", preserveNullAndEmptyArrays: true } }] )
[ { title: 'La porta del cielo' }, { title: 'Neecha Nagar' }, { genres: 'Animation', title: 'Brave' }, { genres: 'Adventure', title: 'Brave' }, { genres: 'Comedy', title: 'Brave' }, { genres: 'Action', title: 'Inception' }, { genres: 'Mystery', title: 'Inception' }, { genres: 'Sci-Fi', title: 'Inception' }]

다음 $unwind 작업은 includeArrayIndex 옵션을 사용하여 출력에 배열 인덱스를 포함합니다.

db.movies.aggregate( [ { $match: { title: "Inception" } }, { $project: { _id: 0, title: 1, genres: 1 } }, { $unwind: { path: "$genres", includeArrayIndex: "genreIndex" } }] )
[ { genres: 'Action', title: 'Inception', genreIndex: Long('0') }, { genres: 'Mystery', title: 'Inception', genreIndex: Long('1') }, { genres: 'Sci-Fi', title: 'Inception', genreIndex: Long('2') }]

다음 파이프라인은 genres 배열을 풀고 결과 문서를 장르별로 그룹화하여 각 장르의 영화 수를 계산합니다.

db.movies.aggregate( [ // First Stage { $match: { title: { $in: [ "The Dark Knight", "Inception", "Interstellar", "Brave" ] } } }, // Second Stage { $project: { _id: 0, title: 1, genres: 1 } }, // Third Stage { $unwind: "$genres" }, // Fourth Stage { $group: { _id: "$genres", movieCount: { $sum: 1 } } }, // Fifth Stage { $sort: { movieCount: -1 } }] )
[ { _id: 'Adventure', movieCount: 2 }, { _id: 'Action', movieCount: 2 }, { _id: 'Drama', movieCount: 2 }, { _id: 'Sci-Fi', movieCount: 2 }, { _id: 'Crime', movieCount: 1 }, { _id: 'Animation', movieCount: 1 }, { _id: 'Comedy', movieCount: 1 }, { _id: 'Mystery', movieCount: 1 }]

단일 파이프라인에서 $unwind을(를) 여러 번 적용하여 여러 배열 필드가 포함된 문서를 확장할 수 있습니다. 다음 작업은 genres 배열을 언와인드한 다음 cast 배열을 언와인드하여 모든 장르-배우 조합에 대한 플랫 문서를 생성한 다음, 장르별로 그룹화하여 각 장르의 총 출연 횟수를 계산합니다.

db.movies.aggregate( [ // First Stage { $match: { title: { $in: [ "Inception", "The Dark Knight", "Interstellar" ] } } }, // Second Stage { $project: { _id: 0, title: 1, genres: 1, cast: 1 } }, // Third Stage { $unwind: "$genres" }, // Fourth Stage { $unwind: "$cast" }, // Fifth Stage { $group: { _id: "$genres", castAppearances: { $sum: 1 } } }] )
[ { _id: 'Adventure', castAppearances: 4 }, { _id: 'Crime', castAppearances: 4 }, { _id: 'Action', castAppearances: 8 }, { _id: 'Drama', castAppearances: 8 }, { _id: 'Mystery', castAppearances: 4 }, { _id: 'Sci-Fi', castAppearances: 8 }]

관련 단계 및 표현식은 $group, $sum, $sort 및 $multiply을(를) 참조하세요.

전체 예시는 배열 및 그룹 데이터 풀기 튜토리얼을 참조하세요.

이 페이지 평가하기