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

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는 기본값 으로 입력 문서 무시하고 해당 입력 문서 에 대한 문서를 출력하지 않습니다.

배열 필드 누락되었거나, null이거나 빈 배열 문서를 출력하려면 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 단계를 사용합니다. 두 문서("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
}
]

이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.

다음 Movie 클래스는 sample_mflix.movies 컬렉션의 문서를 모델링합니다.

public class Movie
{
public ObjectId Id { get; set; }
public int Runtime { get; set; }
public string Title { get; set; }
public string Rated { get; set; }
public List<string> Genres { get; set; }
public string Plot { get; set; }
public ImdbData Imdb { get; set; }
public int Year { get; set; }
public int Index { get; set; }
public string[] Comments { get; set; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
}

참고

Pascal Case를 위한 ConventionPack

이 페이지의 C# 클래스는 속성 이름에 파스칼 표기법을 사용하지만, MongoDB 컬렉션의 필드 이름은 카멜 표기법을 사용합니다. 이 차이를 해결하기 위해 애플리케이션이 시작될 때 다음 코드를 사용하여 ConventionPack을 등록할 수 있습니다.

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

MongoDB .NET/ C# 운전자 사용하여 $unwind 집계 파이프라인 에 단계를 추가하려면 PipelineDefinition 객체 에서 Unwind() 메서드를 호출합니다.

다음 예시 각 입력 Movie 문서 의 Genres 필드 반복하는 파이프라인 단계를 만듭니다. Genres 필드 의 각 값에 대해 스테이지에서는 새 Movie 문서 만들고 해당 Genres 필드 입력 문서 의 Genres 값으로 채웁니다.

var pipeline = new EmptyPipelineDefinition<Movie>()
.Unwind(m => m.Genres);

AggregateUnwindOptions 객체 사용하여 Unwind() 메서드의 동작을 사용자 지정할 수 있습니다.

다음 예시 이전 예시 와 동일한 작업을 수행하지만 다음 옵션도 포함되어 있습니다.

  • PreserveNullAndEmptyArrays Genres 필드 에 빈 배열 포함된 문서가 출력에 포함되도록 합니다.

  • IncludeArrayIndex 옵션은 각 출력 문서 에 Index 라는 새 필드 추가합니다. 이 필드 의 값은 입력 문서의 Genres 배열 에 있는 Genres 필드 값의 배열 인덱스 입니다.

var pipeline = new EmptyPipelineDefinition<Movie>()
.Unwind(m => m.Genres,
new AggregateUnwindOptions<Movie>()
{
PreserveNullAndEmptyArrays = true,
IncludeArrayIndex = new ExpressionFieldDefinition<Movie, int>(
m => m.Index)
});

이 페이지의 Node.js 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix 데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB Node.js 운전자 설명서에서 시작하기 를 참조하세요.

MongoDB Node.js 운전자 사용하여 집계 파이프라인 에 $unwind 단계를 추가하려면 파이프라인 객체 에서 $unwind 연산자 사용합니다.

다음 예시 각 입력 movie 문서 의 genres 필드 반복하는 파이프라인 단계를 만듭니다. genres 필드 의 각 값에 대해 스테이지에서는 새 movie 문서 만들고 해당 genres 필드 입력 문서 의 genres 값으로 채웁니다. 그런 다음 이 예시 에서는 집계 파이프라인 실행합니다.

const pipeline = [{ $unwind: "$genres" }];
const cursor = collection.aggregate(pipeline);
return cursor;

$unwind 메서드의 동작을 사용자 지정할 수 있습니다. 다음 예시 이전 예시 와 동일한 작업을 수행하지만 다음 옵션도 포함되어 있습니다.

  • preserveNullAndEmptyArrays genres 필드 에 빈 배열 포함된 문서가 출력에 포함되도록 합니다.

  • includeArrayIndex 각 출력 문서 에 index 이라는 새 필드 추가합니다. 이 필드 에는 입력 문서의 genres 필드 에 있는 genres 값의 배열 인덱스 포함되어 있습니다.

const pipeline = [
{
$unwind: {
path: "$genres",
preserveNullAndEmptyArrays: true,
includeArrayIndex: "index"
}
}
];
const cursor = collection.aggregate(pipeline);
return cursor;

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

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

이 페이지 평가하기