Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

정렬 배열(집계)

이 페이지의 내용

  • 정의
  • 행동
  • 예시
$sortArray

버전 5.2에 추가되었습니다.

요소를 기준으로 배열을 정렬합니다. 정렬 순서는 사용자가 지정합니다.

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

$sortArray: {
input: <array>,
sortBy: <sort spec>
}
필드
유형
설명
input
표현식

정렬할 배열입니다.

다음의 표현식인 경우 결과는 null 입니다.

  • 누락된 것으로 평가합니다.

  • null 기준으로 평가합니다.

  • undefined 기준으로 평가합니다.

표현식이 배열이 아닌 다른 값으로 평가되면 작업이 오류로 발생합니다.

sortBy
document 또는 boolean
문서에서 정렬 순서를 지정합니다.

$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, ageaddress이 있습니다. 다음 예시에서는 이러한 하위 요소를 사용하여 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 } }
] }

돌아가기

$slice

이 페이지의 내용