W3docs

MongoDB Sort

Lernen Sie, MongoDB-Abfrageergebnisse in Python mit der sort()-Methode von PyMongo zu sortieren — aufsteigend, absteigend, mehrere Felder, kombiniert mit limit und filter.

Dieses Kapitel erklärt, wie man MongoDB-Abfrageergebnisse in Python mit dem pymongo-Treiber sortiert. Sie lernen, nach einem einzelnen Feld auf- oder absteigend zu sortieren, nach mehreren Feldern gleichzeitig zu sortieren, Sortierung mit Filterung und Begrenzung zu kombinieren und zu verstehen, wann ein Index die Sortierung beschleunigt.

Voraussetzungen

Sie sollten mit dem Verbinden zu MongoDB und dem Abfragen von Dokumenten vertraut sein. Falls Sie das noch nicht getan haben, lesen Sie zuerst MongoDB Find und MongoDB Query.

Die folgenden Beispiele setzen eine Collection namens products in einer Datenbank namens store voraus. Sie können die auf dieser Seite verwendeten Beispieldokumente mit folgendem Code einfügen:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["store"]
col = db["products"]

# Insert sample data (skip if already inserted)
col.drop()
col.insert_many([
    {"name": "Keyboard", "category": "Electronics", "price": 49.99, "stock": 120},
    {"name": "Mouse",    "category": "Electronics", "price": 29.99, "stock": 85},
    {"name": "Desk",     "category": "Furniture",   "price": 249.99, "stock": 30},
    {"name": "Chair",    "category": "Furniture",   "price": 189.99, "stock": 45},
    {"name": "Monitor",  "category": "Electronics", "price": 319.99, "stock": 60},
    {"name": "Lamp",     "category": "Furniture",   "price": 39.99,  "stock": 200},
])
print("Sample data inserted.")

Die sort()-Methode

Die sort()-Methode wird auf einem Cursor (dem von find() zurückgegebenen Objekt) aufgerufen und weist MongoDB an, in welcher Reihenfolge Dokumente zurückgegeben werden sollen. Ihre Signatur lautet:

cursor.sort(key_or_list, direction=None)
  • key_or_list — ein Feldname (string) beim Sortieren nach einem einzelnen Feld oder eine Liste von (field, direction)-Tupeln beim Sortieren nach mehreren Feldern.
  • directionpymongo.ASCENDING (Wert 1) oder pymongo.DESCENDING (Wert -1). Erforderlich, wenn key_or_list ein einfacher string ist; weglassen bei Verwendung der Listenform.

Die Verwendung der benannten Konstanten (pymongo.ASCENDING / pymongo.DESCENDING) anstelle von rohen Ganzzahlen macht den Code leichter lesbar und vermeidet Fehler durch falsche Werte.

Aufsteigend sortieren

Übergeben Sie pymongo.ASCENDING als zweites Argument, um vom niedrigsten zum höchsten Wert zu sortieren:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["store"]
col = db["products"]

results = col.find({}, {"_id": 0, "name": 1, "price": 1}).sort("price", pymongo.ASCENDING)

for doc in results:
    print(doc)

Erwartete Ausgabe (günstigstes zuerst):

{'name': 'Mouse', 'price': 29.99}
{'name': 'Lamp', 'price': 39.99}
{'name': 'Keyboard', 'price': 49.99}
{'name': 'Chair', 'price': 189.99}
{'name': 'Desk', 'price': 249.99}
{'name': 'Monitor', 'price': 319.99}

Die Projektion {"_id": 0, "name": 1, "price": 1} begrenzt die zurückgegebenen Felder auf name und price, was die Ausgabe übersichtlich hält. Projektionen werden in MongoDB Find behandelt.

Absteigend sortieren

Übergeben Sie pymongo.DESCENDING, um die Reihenfolge umzukehren (höchster zu niedrigstem Wert):

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["store"]
col = db["products"]

results = col.find({}, {"_id": 0, "name": 1, "price": 1}).sort("price", pymongo.DESCENDING)

for doc in results:
    print(doc)

Erwartete Ausgabe (teuerstes zuerst):

{'name': 'Monitor', 'price': 319.99}
{'name': 'Desk', 'price': 249.99}
{'name': 'Chair', 'price': 189.99}
{'name': 'Keyboard', 'price': 49.99}
{'name': 'Lamp', 'price': 39.99}
{'name': 'Mouse', 'price': 29.99}

Nach mehreren Feldern sortieren

Wenn Sie nach mehr als einem Feld sortieren möchten — zum Beispiel zuerst nach Kategorie und dann nach Preis innerhalb jeder Kategorie — übergeben Sie eine Liste von (field, direction)-Tupeln:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["store"]
col = db["products"]

results = col.find({}, {"_id": 0, "name": 1, "category": 1, "price": 1}).sort([
    ("category", pymongo.ASCENDING),
    ("price",    pymongo.ASCENDING),
])

for doc in results:
    print(doc)

Erwartete Ausgabe (Kategorien A-Z, günstigstes zuerst innerhalb jeder Kategorie):

{'name': 'Mouse', 'category': 'Electronics', 'price': 29.99}
{'name': 'Keyboard', 'category': 'Electronics', 'price': 49.99}
{'name': 'Monitor', 'category': 'Electronics', 'price': 319.99}
{'name': 'Lamp', 'category': 'Furniture', 'price': 39.99}
{'name': 'Chair', 'category': 'Furniture', 'price': 189.99}
{'name': 'Desk', 'category': 'Furniture', 'price': 249.99}

Die Sortierfelder werden von links nach rechts angewendet: MongoDB sortiert alle Dokumente zunächst nach category und löst dann Gleichstände innerhalb desselben Kategoriewerts nach price auf.

sort() mit Filterung kombinieren

sort() funktioniert mit jedem Abfragefilter. Der Filter wählt aus, welche Dokumente übereinstimmen; sort() ordnet dann nur diese übereinstimmenden Dokumente:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["store"]
col = db["products"]

# Find Electronics only, sorted cheapest first
query  = {"category": "Electronics"}
fields = {"_id": 0, "name": 1, "price": 1}

results = col.find(query, fields).sort("price", pymongo.ASCENDING)

for doc in results:
    print(doc)

Erwartete Ausgabe:

{'name': 'Mouse', 'price': 29.99}
{'name': 'Keyboard', 'price': 49.99}
{'name': 'Monitor', 'price': 319.99}

Weitere Filteroptionen wie Bereichsabfragen ($gt, $lt) und Musterabgleich finden Sie unter MongoDB Query.

sort() mit limit() kombinieren

Verketten Sie limit() nach sort(), um die N besten (oder schlechtesten) Dokumente zu erhalten. Die Reihenfolge der Verkettung spielt keine Rolle — MongoDB wendet die Sortierung immer vor der Begrenzung an:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["store"]
col = db["products"]

# Top 3 most expensive products
results = col.find({}, {"_id": 0, "name": 1, "price": 1}) \
             .sort("price", pymongo.DESCENDING) \
             .limit(3)

for doc in results:
    print(doc)

Erwartete Ausgabe:

{'name': 'Monitor', 'price': 319.99}
{'name': 'Desk', 'price': 249.99}
{'name': 'Chair', 'price': 189.99}

Lesen Sie MongoDB Limit für mehr Informationen zur Steuerung der Anzahl zurückgegebener Dokumente.

Performance: Index für große Collections verwenden

Bei kleinen Collections sortiert MongoDB Ergebnisse im Arbeitsspeicher. Bei einer großen Collection kann eine speicherinterne Sortierung langsam sein und — wenn sie 100 MB überschreitet — gibt MongoDB einen Fehler zurück. Das Erstellen eines Index auf dem Sortierfeld ermöglicht es MongoDB, vorgeordnete Daten zurückzugeben, ohne die gesamte Collection zu durchsuchen:

import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["store"]
col = db["products"]

# Create a single-field index on price (ascending)
col.create_index([("price", pymongo.ASCENDING)])

# Queries that sort by price now use the index automatically
results = col.find({}, {"_id": 0, "name": 1, "price": 1}).sort("price", pymongo.ASCENDING)

for doc in results:
    print(doc)

Für Sortierungen nach mehreren Feldern erstellen Sie einen zusammengesetzten Index, dessen Felder und Richtungen Ihrer Sortierung entsprechen:

col.create_index([
    ("category", pymongo.ASCENDING),
    ("price",    pymongo.ASCENDING),
])

Jeder Index muss nur einmal erstellt werden. Wiederholte Aufrufe von create_index() mit demselben Schlüssel sind sicher — PyMongo prüft, ob der Index bereits existiert.

Verbindungszeichenfolge sicher speichern

Die obigen Beispiele kodieren die Verbindungszeichenfolge der Einfachheit halber direkt im Code. In einer echten Anwendung sollten Sie sie in einer Umgebungsvariable speichern:

import os
import pymongo

client = pymongo.MongoClient(os.environ["MONGODB_URI"])

Setzen Sie die Variable in Ihrer Shell (export MONGODB_URI="mongodb://localhost:27017/") oder verwenden Sie eine .env-Datei mit einer Bibliothek wie python-dotenv.

Zusammenfassung

ZielCode-Muster
Aufsteigend sortieren.sort("field", pymongo.ASCENDING)
Absteigend sortieren.sort("field", pymongo.DESCENDING)
Nach mehreren Feldern sortieren.sort([("f1", pymongo.ASCENDING), ("f2", pymongo.DESCENDING)])
Die N besten Ergebnisse.sort(...).limit(N)
Schnelle Sortierung bei großen DatenmengenIndex auf dem Sortierfeld erstellen

Verwandte Kapitel in dieser Reihe:

Was this page helpful?