정렬 배열(집계)
정의
$sortArray
버전 5.2에 추가되었습니다.
요소를 기준으로 배열을 정렬합니다. 정렬 순서는 사용자가 지정합니다.
$sortArray
의 구문은 다음과 같습니다:$sortArray: { input: <array>, sortBy: <sort spec> } 필드유형설명input
표현식정렬할 배열입니다.
다음의 표현식인 경우 결과는
null
입니다.누락된 것으로 평가합니다.
null
으로 평가합니다.undefined
으로 평가합니다.
표현식 이 배열이 아닌 다른 값으로 평가되면 연산에서 오류가 발생합니다.
sortBy
문서 또는 부울문서에서 정렬 순서를 지정합니다.
행동
$sortArray
표현식은 sortBy
사양에 따라 input
배열을 정렬합니다.
$sortArray
구문 및 의미 체계는$sort
에 의해 수정된 $push
작업의 동작과 동일합니다
문서 필드별로 정렬
배열 요소가 문서인 경우 문서 필드별로 정렬할 수 있습니다. 필드 이름과 정렬 방향(오름차순(1
) 또는 내림차순(-1
)을 지정합니다.
{ input: <array-of-documents>, sortBy: { <document-field>: <sort-direction> } }
값으로 정렬
전체 배열을 값을 기준으로 정렬하거나 문서가 아닌 배열 요소를 기준으로 정렬하려면 입력 배열을 식별하고 sortBy
매개변수에서 오름차순 정렬의 경우 1을, 내림차순 정렬의 경우 -1을 지정하십시오.
{ input: <array-of-documents>, sortBy: <sort-direction> }
고려 사항
정렬 키에는 암시적 배열 탐색이 없습니다.
위치 연산자는 지원되지 않습니다. "values.1" 같은 필드 이름
values
배열에서 "1" 이라는 하위 필드를 나타냅니다.values
배열의 인덱스 1에 있는 항목을 참조하지 않습니다.전체 배열이 정렬되는 경우 정렬은 사전식으로 이루어집니다. 집계
$sort
단계는 다르게 동작합니다. 자세한 내용은$sort
을(를) 참조하세요.배열이 필드를 기준으로 정렬되면 지정된 필드가 없는 모든 문서 또는 스칼라가 동일하게 정렬됩니다. 결과 정렬 순서는 정의되지 않습니다.
null
값과 누락된 값을 동일하게 정렬합니다.
정렬 안정성
정렬의 안정성이 지정되지 않았습니다. 사용자는 특정 정렬 알고리즘을 사용하기 위해 $sortArray
에만 의존해서는 안 됩니다.
예시
이 섹션의 $sortArray
예시는 MongoDB 5.2 이상에서 작동합니다.
team
컬렉션을 생성합니다.
db.engineers.insertOne( { "team": [ { "name": "pat", "age": 30, "address": { "street": "12 Baker St", "city": "London" } }, { "name": "dallas", "age": 36, "address": { "street": "12 Cowper St", "city": "Palo Alto" } }, { "name": "charlie", "age": 42, "address": { "street": "12 French St", "city": "New Brunswick" } } ] } )
team
배열에는 세 개의 요소가 있습니다. team
의 각 요소에는 중첩된 하위 요소인 name
, age
및 address
이 있습니다. 다음 예시에서는 이러한 하위 요소를 사용하여 team
배열을 정렬하는 방법을 보여 줍니다.
필드에서 정렬
배열 요소 내의 필드를 기준으로 정렬합니다:
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: "$team", sortBy: { name: 1 } } } } } ] )
name
필드는 team
배열의 하위 요소입니다. 이 연산은 다음과 같은 결과를 반환합니다:
{ result: [ { name: 'charlie', age: 42, address: { street: '12 French St', city: 'New Brunswick' } }, { name: 'dallas', age: 36, address: { street: '12 Cowper St', city: 'Palo Alto' } }, { name: 'pat', age: 30, address: { street: '12 Baker St', city: 'London' } } ] }
하위 필드에서 정렬
address
필드는 자체 하위 필드가 있는 문서입니다. 점 표기법을 사용하여 하위 필드를 기준으로 배열을 정렬합니다:
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: "$team", sortBy: { "address.city": -1 } } } } } ] )
sortBy
값이 "-1" 이므로 정렬 방향은 내림차순입니다.
{ result: [ { name: 'dallas', age: 36, address: { street: '12 Cowper St', city: 'Palo Alto' } }, { name: 'charlie', age: 42, address: { street: '12 French St', city: 'New Brunswick' } }, { name: 'pat', age: 30, address: { street: '12 Baker St', city: 'London' } } ] }
여러 필드에서 정렬
여러 인덱스 필드를 지정하여 복합 정렬을 수행합니다:
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: "$team", sortBy: { age: -1, name: 1 } } } } } ] )
출력 예시:
{ name: 'charlie', age: 42, address: { street: '12 French St', city: 'New Brunswick' } }, { name: 'dallas', age: 36, address: { street: '12 Cowper St', city: 'Palo Alto' } }, { name: 'pat', age: 30, address: { street: '12 Baker St', city: 'London' } }
정수 배열 정렬
이 예시에서는 입력 배열을 직접 지정합니다. 값은 모두 동일한 유형인 Int32입니다:
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: [ 1, 4, 1, 6, 12, 5 ], sortBy: 1 } } } } ] )
출력 예시:
[ { result: [ 1, 1, 4, 5, 6, 12 ] } ]
입력 배열은 위치 0과 위치 2에 "1"을 포함하고 있습니다. 결과에서는 1들이 그룹화되지만, 원래 순서와 관련하여 그룹이 어떻게 정렬될지에 대한 보장은 없습니다.
혼합 유형 필드에서 정렬
이 예시에서는 입력 배열을 직접 지정합니다. 이때 배열의 값들은 서로 다른 유형을 가지고 있습니다.
db.engineers.aggregate( [ { $project: { _id: 0, result: { $sortArray: { input: [ 20, 4, { a: "Free" }, 6, 21, 5, "Gratis", { a: null }, { a: { sale: true, price: 19 } }, Decimal128( "10.23" ), { a: "On sale" } ], sortBy: 1 } } } } ] )
출력 예시:
{ result: [ 4, 5, 6, Decimal128("10.23"), 20, 21, 'Gratis', { a: null }, { a: 'Free' }, { a: 'On sale' }, { a: { sale: true, price: 19 } } ] }
결과는 순서대로 정렬됩니다.
그러나 sortBy
필드를 문서 필드 중 하나인 sortBy: { a: 1 }
로 변경하여 정렬 기준을 바꾸면 스칼라 및 null
값의 정렬 순서가 정의되지 않습니다:
{ result: [ 20, 4, 6, 21, 5, 'Gratis', { a: null }, Decimal128("10.23"), { a: 'Free' }, { a: 'On sale' }, { a: { sale: true, price: 19 } } ] }