View a markdown version of this page

$sort - Amazon DocumentDB

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

$sort

$sort 집계 단계는 지정된 필드 값을 기반으로 파이프라인의 문서를 정렬합니다. 문서는 제공된 정렬 기준에 따라 오름차순 또는 내림차순으로 정렬됩니다.

파라미터

  • field: 정렬 기준으로 사용할 필드 이름입니다.

  • order: 오1름차순 또는 내림차순에 -1를 사용합니다.

예제(MongoDB 쉘)

다음 예제에서는 $sort 스테이지를 사용하여 가격을 기준으로 제품을 내림차순으로 주문하는 방법을 보여줍니다.

샘플 문서 생성

db.products.insertMany([ { _id: 1, name: "Laptop", category: "Electronics", price: 1200 }, { _id: 2, name: "Mouse", category: "Electronics", price: 25 }, { _id: 3, name: "Desk", category: "Furniture", price: 350 }, { _id: 4, name: "Chair", category: "Furniture", price: 150 }, { _id: 5, name: "Monitor", category: "Electronics", price: 400 } ]);

쿼리 예제

db.products.aggregate([ { $sort: { price: -1 } } ]);

출력

[ { _id: 1, name: 'Laptop', category: 'Electronics', price: 1200 }, { _id: 5, name: 'Monitor', category: 'Electronics', price: 400 }, { _id: 3, name: 'Desk', category: 'Furniture', price: 350 }, { _id: 4, name: 'Chair', category: 'Furniture', price: 150 }, { _id: 2, name: 'Mouse', category: 'Electronics', price: 25 } ]

코드 예제

$sort 집계 단계 사용에 대한 코드 예제를 보려면 사용하려는 언어의 탭을 선택합니다.

Node.js
const { MongoClient } = require('mongodb'); async function example() { const client = await MongoClient.connect('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'); const db = client.db('test'); const collection = db.collection('products'); const result = await collection.aggregate([ { $sort: { price: -1 } } ]).toArray(); console.log(result); await client.close(); } example();
Python
from pymongo import MongoClient def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') db = client['test'] collection = db['products'] result = list(collection.aggregate([ { '$sort': { 'price': -1 } } ])) print(result) client.close() example()

증분 정렬

증분 정렬은 Amazon DocumentDB가 이미 다중 필드 정렬의 선행 필드를 정렬하는 인덱스를 사용하는 최적화입니다. 그런 다음 Amazon DocumentDB는 동일한 선행 값을 공유하는 각 문서 그룹 내의 나머지 필드만 정렬합니다. Amazon DocumentDB는 메모리의 전체 결과 세트를 하나의 블록(전체 정렬)으로 정렬하는 대신 인덱스 순서로 문서를 읽습니다. 그런 다음 그룹당 하나씩 작고 독립적인 정렬을 수행합니다. 결과는 전체 정렬과 동일합니다. 쿼리 계획과 사용하는 메모리 및 작업량만 변경됩니다.

장점

증분 정렬은 다음과 같은 이점을 제공합니다.

  • 메모리 사용량이 적고 디스크 기반 정렬 유출이 적습니다. Amazon DocumentDB는 한 번에 전체 결과 집합 대신 한 번에 하나의 소규모 그룹을 주문합니다.

  • 를 사용하여 더 빠른 결과를 얻을 수 있습니다limit. Amazon DocumentDB는 전체 입력을 읽기 전에 정렬된 문서를 내보낼 수 있습니다. 정렬 후 limit (예: 최상위 N 또는 페이지 매김 쿼리)는 충분한 문서를 생성하는 즉시 중지될 수 있습니다.

Amazon DocumentDB가 증분 정렬을 선택하는 경우

예를 들어의 정렬{ customerId: 1, orderDate: -1 }과의 인덱스만 주어진 경우 인덱스{ customerId: 1 }는 이미에서 정렬한 문서를 반환합니다customerId. Amazon DocumentDB는 동일한를 공유하는 각 문서 그룹만 주문customerId하면 됩니다orderDate. 이미 정렬된 선행 필드(customerId)는 미리 정렬된 키입니다. 인덱스가 이미 제공하는 정렬의 양에 따라 Amazon DocumentDB는 다음 세 가지 동작 중 하나를 선택합니다.

  • 인덱스는 모든 정렬 키를 정렬합니다. 정렬이 필요하지 않습니다. Amazon DocumentDB는 요청된 순서로 문서를 직접 읽습니다.

  • 인덱스는 정렬 키의 선행 접두사를 정렬합니다. Amazon DocumentDB는 증분 정렬을 사용하여 사전 정렬된 각 그룹 내에서 후행 키만 정렬합니다.

  • 인덱스는 선행 정렬 키를 정렬하지 않습니다. Amazon DocumentDB는 전체 입력에 대해 전체 정렬을 수행합니다.

요구 사항 및 제한 사항

증분 정렬에는 플래너 버전 3.0(Amazon DocumentDB 8.0.2의 기본 쿼리 플래너)을 실행하는 Amazon DocumentDB 8.0.2 이상이 필요합니다. 플래너 버전에 대한 자세한 내용은 섹션을 참조하세요쿼리 플래너 v3.

Amazon DocumentDB는 부분 인덱스 또는 다중 키(배열) 인덱스를 사용하여 증분 정렬에 대해 접두사를 제공할 수 없습니다. 이러한 경우 Amazon DocumentDB는 전체 정렬로 돌아갑니다. 이는 결과의 정확성에 영향을 미치지 않습니다.

를 사용하여 증분 정렬 확인 explain()

explain()를 사용하여 쿼리가 증분 정렬을 사용하는지 확인합니다. 이기는 계획에서 증분 정렬은 인덱스가 이미 정렬한 선행 정렬 필드를 나열하는 presortedKeys 배열이 포함된 SORT 단계로 나타납니다. 전체 정렬은 presortedKeys 배열이 없는 SORT 단계로 나타납니다. presortedKeys 필드는 explain() 출력에 대한 Amazon DocumentDB별 추가이며 MongoDB 설명 계획에 표시되지 않습니다.

db.orders.createIndex({ customerId: 1 }) db.orders.find({}).sort({ customerId: 1, orderDate: -1 }).explain()
{ "stage": "SORT", "sortPattern": { "customerId": 1, "orderDate": -1 }, "presortedKeys": [ "customerId" ], "inputStage": { "stage": "IXSCAN", "indexName": "customerId_1", "direction": "forward" } }