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 は、メモリ内の結果セット全体を 1 つのブロック (完全ソート) としてソートする代わりに、ドキュメントをインデックス順に読み取ります。次に、グループごとに 1 つずつ、多数の小さな独立したソートを実行します。結果はフルソートと同じです。変更を使用するのは、クエリプランとメモリ量と作業量のみです。

利点

増分ソートには次の利点があります。

  • メモリ使用量が少なく、ディスクベースのソートスピルが少なくなります。Amazon DocumentDB は、結果セット全体を一度に注文するのではなく、一度に 1 つの小さなグループを注文します。

  • を使用すると、より高速な結果が得られますlimit。Amazon DocumentDB は、入力全体を読み取る前にソートされたドキュメントを出力できます。ソートの後に が続くと limit (トップ N やページ分割されたクエリなど)、十分なドキュメントが生成されるとすぐに停止できます。

Amazon DocumentDB が増分ソートを選択する場合

たとえば、 のソート{ customerId: 1, orderDate: -1 }と のみのインデックスがある場合{ customerId: 1 }、インデックスは によって順序付けられたドキュメントを既に返しますcustomerId。Amazon DocumentDB は、 customerIdによって同じ を共有するドキュメントの各グループのみを注文する必要がありますorderDate。既に順序付けされている先頭フィールド (customerId) は、事前ソートされたキーです。インデックスが既に提供しているソートの量に応じて、Amazon DocumentDB は 3 つの動作のいずれかを選択します。

  • インデックスはすべてのソートキーを順序付けします。ソートは必要ありません。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()、クエリが増分ソートを使用していることを確認します。獲得プランでは、増分ソートがSORTステージとして表示され、インデックスが既に順序付けされている先頭のソートフィールドを一覧表示するpresortedKeys配列が含まれます。フルソートは、presortedKeys配列のないSORTステージとして表示されます。presortedKeys フィールドは出力への Amazon DocumentDB 固有の追加explain()であり、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" } }