HOWTO · MongoDB
Stellen Sie mithilfe von Python eine lokale Verbindung zu einer MongoDB-Datenbank her
In diesem Python-MongoDB-Tutorial lernen Sie die Grundlagen von PyMongo kennen, wie Sie eine MongoDB-Datenbank lokal mit Python verbinden und einige einfache Datenbankoperationen durchführen.
Auf dieser Seite
Mit PyMongo, dem Python-Treiber von MongoDB, können Sie eine Verbindung zu einer MongoDB-Bereitstellung herstellen, eine Datenbank und eine Sammlung auswählen sowie BSON-Dokumente einfügen oder abfragen. Der folgende Ablauf verwendet eine MongoDB-URI und eine kleine Sammlung für eine Einkaufsliste. Ersetzen Sie die Platzhalter in der URI durch die Verbindungsdaten Ihrer Bereitstellung und speichern Sie Zugangsdaten nicht in der Versionsverwaltung. (insert_many(); insert_one())
Python und PyMongo installieren
Installieren Sie Python und anschließend PyMongo mit python -m pip install pymongo. Das Beispiel verwendet eine DNS-Seed-List-URI mit dem Präfix mongodb+srv://. Installieren Sie dafür die DNS-Unterstützung mit python -m pip install "pymongo[srv]" (oder installieren Sie dnspython separat). Wenn Ihre Bereitstellung eine herkömmliche mongodb://-URI bereitstellt, verwenden Sie diese und beachten Sie die zugehörigen Netzwerk- und Authentifizierungseinstellungen.
Speichern Sie das Programm unter pymongo_example.py und starten Sie die lokale Demonstration mit python pymongo_example.py. Für den Datenbankablauf setzen Sie zunächst MONGODB_URI auf die Verbindungszeichenfolge Ihrer MongoDB-Bereitstellung und übergeben dann --database. Unter macOS oder Linux verwenden Sie export MONGODB_URI='mongodb+srv://<username>:<password>@<cluster-name>/'; in PowerShell lautet der Befehl $env:MONGODB_URI = 'mongodb+srv://<username>:<password>@<cluster-name>/'. Ersetzen Sie die Platzhalter, kodieren Sie Sonderzeichen in Zugangsdaten bei Bedarf gemäß dem URI-Format URL-gerecht und speichern Sie keine echten Zugangsdaten in der Versionsverwaltung oder in einem gemeinsam genutzten Shell-Verlauf. Starten Sie das Programm mit python pymongo_example.py --database. Der Dateiname ist im Speicherpfad und im Befehl derselbe.
Mit PyMongo eine Verbindung zu MongoDB herstellen
Erstellen Sie mit der von Ihrer MongoDB-Bereitstellung bereitgestellten URI einen MongoClient. Eine Seed-List-URI enthält den Cluster-Host und kann Authentifizierungsoptionen enthalten. Ersetzen Sie <username>, <password> und <cluster-name> durch Ihre Werte, statt die Platzhalter wörtlich zu übernehmen. Geben Sie die URI nicht aus, da sie Zugangsdaten enthalten kann. Der Datenbankzweig wird nur mit --database ausgewählt und liest die URI aus MONGODB_URI. Ohne dieses Flag führt das Programm seine separate Offline-Demonstration aus und stellt keine Verbindung zu MongoDB her.
Lesen Sie die URI in Ihrer Anwendung aus einer Umgebungsvariablen wie MONGODB_URI und übergeben Sie sie an MongoClient. Bei einem Skript gehört die auszuführende Arbeit in einen Modul-Guard der Form if __name__ == "__main__":, damit beim Import der Datei keine Datenbankoperationen starten. MongoClient verbindet sich verzögert. Daher kann der Client erstellt werden, bevor die erste Datenbankoperation stattfindet. Bei dieser ersten Operation treten häufig Netzwerk-, DNS-, Authentifizierungs- oder Serverauswahlprobleme zutage. Schließen Sie den Client nach Abschluss der Arbeit oder verwenden Sie für ein kurzlebiges Skript einen Kontextmanager.
Eine Datenbank und eine Sammlung auswählen
Wählen Sie mit client["user_shopping_list"] eine Datenbank und mit database["items"] eine Sammlung aus. Diese Ausdrücke liefern Referenzen auf die Datenbank und Sammlung; für sich allein legen sie keine dauerhaft gespeicherten Daten an. MongoDB erstellt Datenbank und Sammlung, sobald ein Einfügevorgang erstmals Daten schreibt. Verwenden Sie beim Einfügen und Abfragen durchgehend dieselben Namen.
Dokumente einfügen
Ein Python-Wörterbuch lässt sich direkt als MongoDB-Dokument verwenden. Das Datenbankbeispiel fügt mit collection.insert_many(documents) zwei Dokumente und mit collection.insert_one(document) ein drittes ein. Das einzelne Dokument enthält einen Python-Wert vom Typ datetime.datetime mit Zeitzone, den PyMongo als BSON-Datum kodiert. Die zurückgegebenen Ergebnisobjekte enthalten die Kennungen der eingefügten Dokumente, mit denen Sie die soeben gespeicherten Datensätze abfragen können. Lassen Sie _id weg, wenn MongoDB die Kennung erzeugen soll. In diesem Beispiel werden eindeutige Kennungen vergeben, damit die Abfrage gezielt die selbst eingefügten Datensätze findet.
Die Einfügevorgänge setzen eine erreichbare MongoDB-Bereitstellung und Schreibberechtigung voraus. Führen Sie Beispiel-Einfügungen nicht wiederholt in einer gemeinsam genutzten Datenbank aus, es sei denn, doppelte Datensätze sind akzeptabel oder das Beispiel verwendet stabile Kennungen und behandelt Fehler wegen doppelter Schlüssel.
Dokumente abfragen und mit fehlenden Feldern umgehen
Mit collection.find({}) können Sie alle Dokumente durchlaufen. Alternativ übergeben Sie einen Filter wie {"category": "food"}, um passende Dokumente auszuwählen. Jedes Ergebnis verhält sich ähnlich wie ein Wörterbuch. Ein direkter Zugriff wie item["category"] löst einen KeyError aus, wenn das Dokument diesen Schlüssel nicht enthält. Verwenden Sie item.get("category", "(not set)"), wenn ein Ersatzwert sinnvoll ist. find() von MongoDB gibt einen Cursor zurück. Durchlaufen Sie diesen also, statt ihn als einzelnes Dokument zu behandeln.
Führen Sie diese lokale Demonstration aus, um zu sehen, wie die Ausgabe Dokumente mit unterschiedlichen Feldern darstellt. Sie läuft offline. Den Datenbankablauf aktivieren Sie wie oben beschrieben separat mit --database und MONGODB_URI.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import os
import sys
import uuid
from datetime import datetime, timezone
def show_documents(documents):
for item in documents:
print(item["item_name"], item.get("category", "(not set)"))
def run_database_workflow():
from pymongo import MongoClient
uri = os.environ.get("MONGODB_URI")
if not uri:
print("Set MONGODB_URI before running with --database.")
return
with MongoClient(uri) as client:
collection = client["user_shopping_list"]["items"]
many = [
{"_id": str(uuid.uuid4()), "item_name": "Bread", "category": "food"},
{"_id": str(uuid.uuid4()), "item_name": "Blender"},
]
many_result = collection.insert_many(many)
single = {
"_id": str(uuid.uuid4()),
"item_name": "Coffee",
"category": "food",
"added_at": datetime.now(timezone.utc),
}
single_result = collection.insert_one(single)
inserted_ids = many_result.inserted_ids + [single_result.inserted_id]
found = collection.find({"_id": {"$in": inserted_ids}})
show_documents(found)
def main():
if "--database" in sys.argv:
run_database_workflow()
else:
# This local sample needs no MongoDB server or connection URI.
show_documents([
{"item_name": "Bread", "category": "food"},
{"item_name": "Blender"},
])
if __name__ == "__main__":
main()
Bread food
Blender (not set)
Die Ausgabe des lokalen Beispiels lautet:
Im Datenbankablauf wird dasselbe sichere Zugriffsmuster beim Durchlaufen des von find() zurückgegebenen Cursors verwendet. Liefert eine Abfrage keine Dokumente, gibt der Cursor einfach keine Zeilen zurück. Prüfen Sie den Filter und den Namen der Sammlung, bevor Sie von einem Verbindungsfehler ausgehen. Beim Import dieses Moduls werden seine Funktionen definiert, aber main() wird nicht aufgerufen und es werden keine Datenbankoperationen ausgeführt.