View a markdown version of this page

$sort - Amazon DocumentDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

$sort

In der $sort Aggregationsphase werden Dokumente in der Pipeline anhand der angegebenen Feldwerte sortiert. Die Dokumente werden gemäß den angegebenen Sortierkriterien in auf- oder absteigender Reihenfolge angeordnet.

Parameter

  • field: Der Feldname, nach dem sortiert werden soll.

  • order: Wird 1 für aufsteigende oder -1 absteigende Reihenfolge verwendet.

Beispiel (MongoDB Shell)

Das folgende Beispiel zeigt, wie die $sort Bühne verwendet wird, um Produkte nach Preis in absteigender Reihenfolge zu sortieren.

Erstellen Sie Beispieldokumente

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 } ]);

Beispiel für eine Abfrage

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

Ausgabe

[ { _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 } ]

Codebeispiele

Um ein Codebeispiel für die Verwendung der $sort Aggregationsstufe anzuzeigen, wählen Sie die Registerkarte für die Sprache, die Sie verwenden möchten:

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()

Inkrementelle Sortierung

Die inkrementelle Sortierung ist eine Optimierung, bei der Amazon DocumentDB einen Index verwendet, der bereits die führenden Felder einer Sortierung mit mehreren Feldern sortiert. Amazon DocumentDB sortiert dann nur die verbleibenden Felder innerhalb jeder Gruppe von Dokumenten, die dieselben führenden Werte aufweisen. Anstatt die gesamte Ergebnismenge im Speicher in einem Block zu sortieren (eine vollständige Sortierung), liest Amazon DocumentDB Dokumente in Indexreihenfolge. Es führt dann viele kleine, unabhängige Sortierungen durch, eine pro Gruppe. Die Ergebnisse sind identisch mit einer vollständigen Sortierung. Nur der Abfrageplan und die Menge an Arbeitsspeicher und Arbeit, die er verwendet, ändern sich.

Vorteile

Die inkrementelle Sortierung bietet die folgenden Vorteile:

  • Geringerer Speicherverbrauch und weniger Probleme bei der datenträgerbasierten Sortierung. Amazon DocumentDB bestellt jeweils eine kleine Gruppe und nicht den gesamten Ergebnissatz auf einmal.

  • Schnellere Ergebnisse mitlimit. Amazon DocumentDB kann sortierte Dokumente ausgeben, bevor es die gesamte Eingabe liest. Eine Sortierung, gefolgt von einer limit (z. B. eine Top-N- oder paginierte Abfrage), kann beendet werden, sobald genügend Dokumente erstellt wurden.

Wenn Amazon DocumentDB eine inkrementelle Sortierung auswählt

Wenn beispielsweise die Sortierung aktiviert { customerId: 1, orderDate: -1 } und nur der Index aktiviert ist, gibt der Index bereits Dokumente zurück{ customerId: 1 }, die nach sortiert sind. customerId Amazon DocumentDB muss nur jede Gruppe von Dokumenten, die dasselbe Format haben, customerId nach orderDate sortieren. Das bereits geordnete führende Feld (customerId) ist der vorsortierte Schlüssel. Je nachdem, wie viel Sortierung ein Index bereits bietet, wählt Amazon DocumentDB eines von drei Verhaltensweisen:

  • Der Index sortiert jeden Sortierschlüssel. Es ist keine Sortierung erforderlich. Amazon DocumentDB liest Dokumente direkt in der angeforderten Reihenfolge.

  • Der Index ordnet ein vorangestelltes Präfix der Sortierschlüssel an. Amazon DocumentDB verwendet eine inkrementelle Sortierung und sortiert nur die nachfolgenden Schlüssel innerhalb jeder vorsortierten Gruppe.

  • Kein Index sortiert nach einem führenden Sortierschlüssel. Amazon DocumentDB führt eine vollständige Sortierung der gesamten Eingabe durch.

Anforderungen und Einschränkungen

Für die inkrementelle Sortierung ist Amazon DocumentDB 8.0.2 oder höher erforderlich, wobei die Planner-Version 3.0 ausgeführt wird (der Standard-Abfrageplaner ab Amazon DocumentDB 8.0.2). Weitere Informationen zu Planer-Versionen finden Sie unter. Abfrageplaner v3

Amazon DocumentDB kann keinen Teilindex oder einen Multikey-Index (Array) verwenden, um das vorsortierte Präfix für eine inkrementelle Sortierung bereitzustellen. In diesen Fällen greift Amazon DocumentDB auf eine vollständige Sortierung zurück. Dies beeinträchtigt niemals die Richtigkeit der Ergebnisse.

Überprüfung einer inkrementellen Sortierung mit explain()

Wird verwendetexplain(), um zu bestätigen, dass eine Abfrage eine inkrementelle Sortierung verwendet. Im erfolgreichen Plan erscheint eine inkrementelle Sortierung als SORT Stufe, die ein presortedKeys Array enthält, das die führenden Sortierfelder auflistet, die der Index bereits sortiert hat. Eine vollständige Sortierung wird als SORT Stufe ohne presortedKeys Array angezeigt. Das presortedKeys Feld ist eine DocumentDB-specific Amazon-Ergänzung zur explain() Ausgabe und erscheint nicht in den Erläuterungsplänen von 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" } }