Schnellstart: Azure Cosmos DB for MongoDB für Python mit MongoDB-Treiber
GILT FÜR: MongoDB
Erste Schritte mit dem PyMongo-Paket zum Erstellen von Datenbanken, Sammlungen und Dokumenten in Ihrer Azure Cosmos DB-Ressource. Führen Sie die nachfolgenden Schritte aus, um das Paket zu installieren und den Beispielcode für grundlegende Aufgaben zu testen.
Hinweis
Die Beispielcodeausschnitte sind auf GitHub als Python-Projekt verfügbar.
In dieser Schnellstartanleitung kommunizieren Sie mit der API für MongoDB von Azure Cosmos DB über einen der Open-Source-MongoDB-Clienttreiber für Python namens PyMongo. Außerdem verwenden Sie die MongoDB-Erweiterungsbefehle, mit denen Sie Datenbankressourcen erstellen und abrufen können, die für das Azure Cosmos DB-Kapazitätsmodell spezifisch sind.
Voraussetzungen
- Ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.
- Ab Python 3.8
- Azure-Befehlszeilenschnittstelle (CLI) oder Azure PowerShell
Prüfen der Voraussetzungen
- Führen Sie in einem Terminal- oder Befehlsfenster den Befehl
python --version
aus, um zu überprüfen, ob Sie über eine aktuelle Version von Python verfügen. - Führen Sie
az --version
(Azure CLI) oderGet-Module -ListAvailable Az*
(Azure PowerShell) aus, um zu überprüfen, ob die geeigneten Azure-Befehlszeilentools installiert wurden.
Einrichten
In diesem Abschnitt werden Sie durch die Schritte zum Erstellen eines Azure Cosmos DB-Kontos und Einrichten eines Projekts geführt, bei dem das MongoDB-npm-Paket verwendet wird.
Erstellen eines Azure Cosmos DB-Kontos
In diesem Schnellstart wird ein einzelnes Azure Cosmos DB-Konto mithilfe der API für MongoDB erstellt.
Erstellen Sie Shellvariablen für accountName, resourceGroupName und location.
# Variable for resource group name resourceGroupName="msdocs-cosmos-quickstart-rg" location="westus" # Variable for account name with a randomnly generated suffix let suffix=$RANDOM*$RANDOM accountName="msdocs-$suffix"
Wenn Sie das noch nicht getan haben, melden Sie sich mithilfe des Befehls
az login
bei der Azure CLI an.Erstellen Sie mit dem Befehl
az group create
eine neue Ressourcengruppe in Ihrem Abonnement.az group create \ --name $resourceGroupName \ --location $location
Erstellen Sie mit dem Befehl
az cosmosdb create
ein neues Azure Cosmos DB for MongoDB-Konto mit Standardeinstellungen.az cosmosdb create \ --resource-group $resourceGroupName \ --name $accountName \ --locations regionName=$location --kind MongoDB
Abrufen der MongoDB-Verbindungszeichenfolge
Suchen Sie mit dem Befehl
az cosmosdb keys list
die Verbindungszeichenfolge der API für MongoDB in der Liste der Verbindungszeichenfolgen für das Konto.az cosmosdb keys list --type connection-strings \ --resource-group $resourceGroupName \ --name $accountName
Zeichnen Sie die PRIMARY KEY-Werte (Primärschlüsselwerte) auf. Sie werden diese Anmeldeinformationen zu einem späteren Zeitpunkt verwenden.
Erstellen einer neuen Python-App
Erstellen Sie mithilfe Ihres bevorzugten Terminals einen neuen leeren Ordner, und ändern Sie das Verzeichnis in den Ordner.
Hinweis
Wenn Sie nur den fertigen Code wünschen, laden Sie das Repository der Beispielcodeausschnitte mit dem vollständigen Beispiel herunter oder forken und klonen Sie es. Sie können auch
git clone
für das Repository in Azure Cloud Shell ausführen, um die in dieser Schnellstartanleitung gezeigten Schritte durchzuführen.Erstellen Sie eine Datei requirements.txt, in der die Pakete PyMongo und python-dotenv aufgelistet sind.
# requirements.txt pymongo python-dotenv
Erstellen Sie eine virtuelle Umgebung, und installieren Sie die Pakete.
# py -3 uses the global python interpreter. You can also use python3 -m venv .venv. py -3 -m venv .venv source .venv/Scripts/activate pip install -r requirements.txt
Konfigurieren von Umgebungsvariablen
Wenn Sie die Werte von CONNECTION STRING (Verbindungszeichenfolge) in Ihrem Code verwenden möchten, legen Sie diesen Wert in der lokalen Umgebung fest, in der die Anwendung ausgeführt wird. Verwenden Sie zum Festlegen der Umgebungsvariablen Ihr bevorzugtes Terminal, um die folgenden Befehle auszuführen:
$env:COSMOS_CONNECTION_STRING = "<cosmos-connection-string>"
Objektmodell
Befassen wir uns nun mit der Hierarchie der Ressourcen in der API für MongoDB und dem Objektmodell, das verwendet wird, um diese Ressourcen zu erstellen und darauf zuzugreifen. Azure Cosmos DB erstellt Ressourcen in einer Hierarchie, die aus Konten, Datenbanken, Sammlungen und Dokumenten besteht.
Hierarchisches Diagramm mit einem Azure Cosmos DB-Konto oben. Das Konto verfügt über zwei untergeordnete Datenbank-Shards. Eine der Datenbank-Shards enthält zwei untergeordnete Sammlungsshards. Die andere Datenbank-Shard enthält eine einzelne untergeordnete Sammlungsshard. Diese einzelne Sammlungs-Shard weist drei untergeordnete Dokument-Shards auf.
Jeder Ressourcentyp wird durch eine Python-Klasse dargestellt. Hier sind die häufigsten Klassen aufgeführt:
MongoClient: Der erste Schritt beim Arbeiten mit PyMongo besteht darin, einen MongoClient zu erstellen, um eine Verbindung mit der API für MongoDB von Azure Cosmos DB herzustellen. Das Clientobjekt wird zum Konfigurieren und Ausführen von Anforderungen für den Dienst verwendet.
Datenbank: Die API für MongoDB von Azure Cosmos DB kann eine oder mehrere unabhängige Datenbanken unterstützen.
Sammlung: Eine Datenbank kann eine oder mehrere Sammlungen enthalten. Eine Sammlung ist eine Gruppe von Dokumenten, die in MongoDB gespeichert sind, und ähnelt ungefähr einer Tabelle in einer relationalen Datenbank.
Dokument: Ein Dokument ist eine Gruppe von Schlüssel-Wert-Paaren. Dokumente weisen ein dynamisches Schema auf. Ein dynamisches Schema bedeutet, dass Dokumente in derselben Sammlung nicht über denselben Satz von Feldern oder dieselbe Struktur verfügen müssen. Außerdem können allgemeine Felder in den Dokumenten einer Sammlung verschiedene Arten von Daten enthalten.
Weitere Informationen zur Hierarchie von Entitäten finden Sie im Artikel Azure Cosmos DB-Ressourcenmodell.
Codebeispiele
- Authentifizieren des Clients
- Abrufen der Datenbank
- Abrufen der Sammlung
- Erstellen eines Index
- Erstellen eines Dokuments
- Abrufen eines Dokuments
- Abfragedokumente
Der in diesem Artikel beschriebene Beispielcode erstellt die Datenbank adventureworks
mit der Sammlung products
. Die Sammlung products
soll Produktdetails wie Name (name), Kategorie (category), Menge (quantity) und einen Verkaufsindikator (sale) enthalten. Jedes Produkt enthält außerdem einen eindeutigen Bezeichner. Der vollständige Beispielcode befindet sich unter https://github.com/Azure-Samples/azure-cosmos-db-mongodb-python-getting-started/tree/main/001-quickstart/.
Für die folgenden Schritte verwendet die Datenbank kein Sharding und zeigt eine synchrone Anwendung mit dem PyMongo-Treiber an. Verwenden Sie für asynchrone Anwendungen den Motor-Treiber.
Authentifizieren des Clients
Erstellen Sie im Projektverzeichnis eine Datei run.py. Fügen Sie in Ihrem Editor require-Anweisungen hinzu, um auf von Ihnen verwendete Pakete zu verweisen, einschließlich der Pakete PyMongo und python-dotenv.
import os import sys from random import randint import pymongo from dotenv import load_dotenv
Rufen Sie die Verbindungsinformationen aus der Umgebungsvariable ab, die in einer .env-Datei definiert ist.
load_dotenv() CONNECTION_STRING = os.environ.get("COSMOS_CONNECTION_STRING")
Definieren Sie Konstanten, die Sie im Code verwenden.
DB_NAME = "adventureworks" COLLECTION_NAME = "products"
Herstellen einer Verbindung mit der API für MongoDB von Azure Cosmos DB
Verwenden Sie das MongoClient-Objekt zum Herstellen einer Verbindung mit Ihrer Azure Cosmos DB for MongoDB-Ressource. Diese Methode gibt einen Verweis auf die Datenbank zurück.
client = pymongo.MongoClient(CONNECTION_STRING)
Abrufen der Datenbank
Überprüfen Sie mit der Methode list_database_names, ob die Datenbank vorhanden ist. Wenn die Datenbank nicht vorhanden ist, verwenden Sie den Erweiterungsbefehl „CreateDatabase“, um sie mit einem festgelegten bereitgestellten Durchsatz zu erstellen.
# Create database if it doesn't exist
db = client[DB_NAME]
if DB_NAME not in client.list_database_names():
# Create a database with 400 RU throughput that can be shared across
# the DB's collections
db.command({"customAction": "CreateDatabase", "offerThroughput": 400})
print("Created db '{}' with shared throughput.\n".format(DB_NAME))
else:
print("Using database: '{}'.\n".format(DB_NAME))
Abrufen der Sammlung
Überprüfen Sie mit der Methode list_collection_names, ob die Sammlung vorhanden ist. Wenn die Sammlung nicht vorhanden ist, verwenden Sie den Erweiterungsbefehl „CreateCollection“, um sie zu erstellen.
# Create collection if it doesn't exist
collection = db[COLLECTION_NAME]
if COLLECTION_NAME not in db.list_collection_names():
# Creates a unsharded collection that uses the DBs shared throughput
db.command(
{"customAction": "CreateCollection", "collection": COLLECTION_NAME}
)
print("Created collection '{}'.\n".format(COLLECTION_NAME))
else:
print("Using collection: '{}'.\n".format(COLLECTION_NAME))
Erstellen eines Index
Erstellen Sie einen Index mit dem Erweiterungsbefehl „UpdateCollection“. Sie können den Index auch im Erweiterungsbefehl „CreateCollection“ festlegen. Legen Sie den Index in diesem Beispiel auf die name
-Eigenschaft fest, damit Sie später mit der Methode sort der cursor-Klasse nach Produktname sortieren können.
indexes = [
{"key": {"_id": 1}, "name": "_id_1"},
{"key": {"name": 2}, "name": "_id_2"},
]
db.command(
{
"customAction": "UpdateCollection",
"collection": COLLECTION_NAME,
"indexes": indexes,
}
)
print("Indexes are: {}\n".format(sorted(collection.index_information())))
Erstellen eines Dokuments
Erstellen Sie ein Dokument mit den product-Eigenschaften für die adventureworks
-Datenbank:
- Eine category-Eigenschaft. Sie kann als logischer Partitionsschlüssel verwendet werden.
- Eine name-Eigenschaft.
- Eine quantity-Bestandseigenschaft.
- Eine sale-Eigenschaft, die angibt, ob das Produkt verkauft wird.
"""Create new document and upsert (create or replace) to collection"""
product = {
"category": "gear-surf-surfboards",
"name": "Yamba Surfboard-{}".format(randint(50, 5000)),
"quantity": 1,
"sale": False,
}
result = collection.update_one(
{"name": product["name"]}, {"$set": product}, upsert=True
)
print("Upserted document with _id {}\n".format(result.upserted_id))
Erstellen Sie ein Dokument in der Sammlung, indem Sie den Vorgang update_one auf Sammlungsebene aufrufen. In diesem Beispiel führen Sie ein Upsert für ein Dokument aus, anstatt ein neues Dokument zu erstellen. Ein Upsert ist in diesem Beispiel nicht erforderlich, da der Produktname zufällig ist. Es empfiehlt sich jedoch ein Upsert, falls Sie den Code mehrmals ausführen und der Produktname identisch ist.
Das Ergebnis des Vorgangs update_one
enthält den _id
-Feldwert, den Sie in nachfolgenden Vorgängen verwenden können. Die _id-Eigenschaft wurde automatisch erstellt.
Abrufen eines Dokuments
Verwenden Sie die find_one-Methode zum Abrufen eines Dokuments.
doc = collection.find_one({"_id": result.upserted_id})
print("Found a document with _id {}: {}\n".format(result.upserted_id, doc))
In Azure Cosmos DB können Sie einen kostengünstigeren Punktlesevorgang durchführen, indem Sie sowohl den eindeutigen Bezeichner (_id
) als auch den Partitionsschlüssel verwenden.
Abfragedokumente
Nachdem Sie ein Dokument eingefügt haben, können Sie eine Abfrage zum Abrufen aller Dokumente ausführen, die einem bestimmten Filter entsprechen. In diesem Beispiel werden alle Dokumente gesucht, die einer bestimmten Kategorie entsprechen: gear-surf-surfboards
. Sobald die Abfrage definiert wurde, rufen Sie Collection.find
auf, um ein Cursor
-Ergebnis zu erhalten. Anschließend verwenden Sie sort.
"""Query for documents in the collection"""
print("Products with category 'gear-surf-surfboards':\n")
allProductsQuery = {"category": "gear-surf-surfboards"}
for doc in collection.find(allProductsQuery).sort(
"name", pymongo.ASCENDING
):
print("Found a product with _id {}: {}\n".format(doc["_id"], doc))
Problembehandlung:
- Vergewissern Sie sich bei Anzeige einer Fehlermeldung wie
The index path corresponding to the specified order-by item is excluded.
, dass der Index erstellt wurde.
Ausführen des Codes
Diese App erstellt eine API für MongoDB-Datenbank und -Sammlung sowie ein Dokument und zeigt dann das betreffende Dokument an. Schließlich gibt das Beispiel eine Abfrage aus, die Dokumente zurückgibt, die einer angegebenen Produktkategorie entsprechen. In jedem Schritt gibt das Beispiel Informationen über die ausgeführten Schritte an die Konsole aus.
Verwenden Sie zur Ausführung der App ein Terminal, um zum Anwendungsverzeichnis zu navigieren und die Anwendung auszuführen.
python run.py
Die Ausgabe der App sollte ähnlich wie dieses Beispiel aussehen:
Created db 'adventureworks' with shared throughput.
Created collection 'products'.
Indexes are: ['_id_', 'name_1']
Upserted document with _id <ID>
Found a document with _id <ID>:
{'_id': <ID>,
'category': 'gear-surf-surfboards',
'name': 'Yamba Surfboard-50',
'quantity': 1,
'sale': False}
Products with category 'gear-surf-surfboards':
Found a product with _id <ID>:
{'_id': ObjectId('<ID>'),
'name': 'Yamba Surfboard-386',
'category': 'gear-surf-surfboards',
'quantity': 1,
'sale': False}
Bereinigen von Ressourcen
Wenn Sie das Azure Cosmos DB for NoSQL-Konto nicht mehr benötigen, können Sie die entsprechende Ressourcengruppe löschen.
Verwenden Sie den Befehl az group delete
zum Löschen der Ressourcengruppe.
az group delete --name $resourceGroupName