문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

zip(집계)

이 페이지의 내용

  • 정의
  • 행동
  • 예제
$zip

출력 배열의 첫 번째 요소가 첫 번째 입력 배열의 첫 번째 요소, 두 번째 입력 배열의 첫 번째 요소 등을 포함하는 배열이 되도록 입력 배열의 배열을 바꿉니다.

예를 들어 $zip[ [ 1, 2, 3 ], [ "a", "b", "c" ] ][ [ 1, "a" ], [ 2, "b" ], [ 3, "c" ] ] 로 변환합니다.

$zip 의 구문은 다음과 같습니다:

{
$zip: {
inputs: [ <array expression1>, ... ],
useLongestLength: <boolean>,
defaults: <array expression>
}
}
피연산자
설명
inputs

배열로 해석되는 표현식의 배열입니다. 이러한 입력 배열의 요소는 결합되어 출력 배열의 배열을 형성합니다.

inputs 배열 중 하나라도 null 값으로 해석되거나 누락된 필드를 참조하는 경우 $zipnull 을 반환합니다.

inputs 배열 중 하나라도 배열 또는 null 로 해석되지 않거나 누락된 필드를 참조하는 경우 $zip 는 오류를 반환합니다.

useLongestLength

가장 긴 배열의 길이가 출력 배열의 배열 수를 결정하는지 여부를 지정하는 부울입니다.

기본값은 false이며 가장 짧은 배열 길이에 따라 출력 배열의 배열 수가 결정됩니다.

defaults

입력 배열의 길이가 다른 경우 사용할 기본 요소 값의 배열입니다. 이 필드와 함께 useLongestLength: true 을(를) 지정해야 하며, 그렇지 않으면 $zip 이(가) 오류를 반환합니다.

useLongestLength: true 이지만 defaults 이 비어 있거나 지정되지 않은 경우 $zipnull 을 기본값으로 사용합니다.

비어 있지 않은 defaults 를 지정하는 경우 입력 배열에 대해 기본값을 지정해야 하며, 그렇지 않으면 $zip 에서 오류를 반환합니다.

입력 배열의 길이가 같을 필요는 없습니다. 기본적으로 출력 배열은 가장 짧은 입력 배열의 길이를 갖지만 useLongestLength 옵션은 $zip 가 가장 긴 입력 배열만큼의 배열을 출력하도록 지시합니다.

예제
결과
{ $zip: { inputs: [ [ "a" ], [ "b" ], [ "c" ] ] }
[ [ "a", "b", "c" ] ]
{ $zip: { inputs: [ [ "a" ], [ "b", "c" ] ] } }
[ [ "a", "b" ] ]
{
$zip: {
inputs: [ [ 1 ], [ 2, 3 ] ],
useLongestLength: true
}
}
[ [ 1, 2 ], [ null, 3 ] ]
{
$zip: {
inputs: [ [ 1 ], [ 2, 3 ], [ 4 ] ],
useLongestLength: true,
defaults: [ "a", "b", "c" ]
}
}

useLongestLength: true이므로 $zip은 더 짧은 입력 배열을 해당하는 defaults 요소로 채웁니다.

결과는 [ [ 1, 2, 4 ], [ "a", 3, "c" ] ]입니다.

컬렉션 matrices에는 다음 문서가 포함되어 있습니다.

db.matrices.insertMany([
{ matrix: [[1, 2], [2, 3], [3, 4]] },
{ matrix: [[8, 7], [7, 6], [5, 4]] },
])

이 컬렉션에 있는 각 3x2 매트릭스 전치를 계산하려면 다음 집계 작업을 사용하면 됩니다.

db.matrices.aggregate([{
$project: {
_id: false,
transposed: {
$zip: {
inputs: [
{ $arrayElemAt: [ "$matrix", 0 ] },
{ $arrayElemAt: [ "$matrix", 1 ] },
{ $arrayElemAt: [ "$matrix", 2 ] },
]
}
}
}
}])

그러면 다음과 같은 2x3 매트릭스가 반환됩니다.

{ "transposed" : [ [ 1, 2, 3 ], [ 2, 3, 4 ] ] }
{ "transposed" : [ [ 8, 7, 5 ], [ 7, 6, 4 ] ] }

$zip$filter와 함께 사용하여 배열에서 요소의 하위 집합을 가져와서 유지되는 각 요소와 함께 원래 인덱스를 저장할 수 있습니다.

pages 컬렉션에는 다음 문서가 포함되어 있습니다.

db.pages.save( {
"category": "unix",
"pages": [
{ "title": "awk for beginners", reviews: 5 },
{ "title": "sed for newbies", reviews: 0 },
{ "title": "grep made simple", reviews: 2 },
] } )

다음 집계 파이프라인은 먼저 pages 배열의 요소를 인덱스와 함께 압축한 다음 리뷰가 하나 이상 있는 페이지만 필터링합니다.

db.pages.aggregate([{
$project: {
_id: false,
pages: {
$filter: {
input: {
$zip: {
inputs: [ "$pages", { $range: [0, { $size: "$pages" }] } ]
}
},
as: "pageWithIndex",
cond: {
$let: {
vars: {
page: { $arrayElemAt: [ "$$pageWithIndex", 0 ] }
},
in: { $gte: [ "$$page.reviews", 1 ] }
}
}
}
}
}
}])

그러면 다음 문서가 반환됩니다.

{
"pages" : [
[ { "title" : "awk for beginners", "reviews" : 5 }, 0 ],
[ { "title" : "grep made simple", "reviews" : 2 }, 2 ] ]
}
← $year (애그리게이션)

이 페이지의 내용