Szybki start: usługa Azure Cosmos DB dla bazy danych MongoDB dla języka Python ze sterownikiem bazy danych MongoDB
DOTYCZY: MongoDB
Rozpocznij pracę z bazą danych MongoDB, aby tworzyć bazy danych, kolekcje i dokumenty w ramach zasobu usługi Azure Cosmos DB. Wykonaj następujące kroki, aby wdrożyć minimalne rozwiązanie w środowisku przy użyciu interfejsu wiersza polecenia dla deweloperów platformy Azure.
Dokumentacja referencyjna interfejsu API dla bazy danych | MongoDB dotycząca pakietu pymongo pakietu | interfejsu wiersza polecenia dla deweloperów platformy Azure
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Konto usługi GitHub
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Interfejs wiersza polecenia dla deweloperów platformy Azure
- Docker Desktop
Konfigurowanie
Wdróż kontener projektowy w swoim środowisku. Następnie użyj interfejsu wiersza polecenia dla deweloperów platformy Azure (azd
), aby utworzyć konto usługi Azure Cosmos DB dla bazy danych MongoDB i wdrożyć konteneryzowaną przykładową aplikację. Przykładowa aplikacja używa biblioteki klienta do zarządzania, tworzenia, odczytywania i wykonywania zapytań dotyczących przykładowych danych.
Ważne
Konta usługi GitHub obejmują uprawnienia do magazynowania i godzin podstawowych bez ponoszenia kosztów. Aby uzyskać więcej informacji, zobacz uwzględnione godziny magazynowania i rdzeni dla kont usługi GitHub.
Otwórz terminal w katalogu głównym projektu.
Uwierzytelnianie w interfejsie wiersza polecenia dla deweloperów platformy Azure przy użyciu polecenia
azd auth login
. Wykonaj kroki określone przez narzędzie, aby uwierzytelnić się w interfejsie wiersza polecenia przy użyciu preferowanych poświadczeń platformy Azure.azd auth login
Użyj
azd init
polecenia , aby zainicjować projekt.azd init --template cosmos-db-mongodb-python-quickstart
Uwaga
W tym przewodniku Szybki start jest używane repozytorium GitHub szablonu azure-samples/cosmos-db-mongodb-python-quickstart . Interfejs wiersza polecenia dla deweloperów platformy Azure automatycznie klonuje ten projekt na maszynę, jeśli jeszcze go nie ma.
Podczas inicjowania skonfiguruj unikatową nazwę środowiska.
Napiwek
Nazwa środowiska będzie również używana jako nazwa docelowej grupy zasobów. W tym przewodniku Szybki start rozważ użycie polecenia
msdocs-cosmos-db
.Wdróż konto usługi Azure Cosmos DB przy użyciu polecenia
azd up
. Szablony Bicep wdrażają również przykładową aplikację internetową.azd up
Podczas procesu aprowizacji wybierz subskrypcję i żądaną lokalizację. Poczekaj na zakończenie procesu aprowizacji. Proces może potrwać około pięciu minut.
Po zakończeniu aprowizacji zasobów platformy Azure adres URL uruchomionej aplikacji internetowej zostanie uwzględniony w danych wyjściowych.
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <https://[container-app-sub-domain].azurecontainerapps.io> SUCCESS: Your application was provisioned and deployed to Azure in 5 minutes 0 seconds.
Użyj adresu URL w konsoli, aby przejść do aplikacji internetowej w przeglądarce. Obserwuj dane wyjściowe uruchomionej aplikacji.
Instalowanie biblioteki klienta
requirements.txt
Utwórz plik w katalogu aplikacji zawierający listę pakietów PyMongo i python-dotenv.# requirements.txt pymongo python-dotenv
Utwórz środowisko wirtualne i zainstaluj pakiety.
# 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
Model obiektów
Przyjrzyjmy się hierarchii zasobów w interfejsie API dla bazy danych MongoDB i modelu obiektów używanego do tworzenia tych zasobów i uzyskiwania do nich dostępu. Usługa Azure Cosmos DB tworzy zasoby w hierarchii składające się z kont, baz danych, kolekcji i dokumentów.
Diagram hierarchiczny przedstawiający konto usługi Azure Cosmos DB u góry. Konto ma dwa podrzędne fragmenty bazy danych. Jeden z fragmentów bazy danych zawiera dwa podrzędne fragmenty kolekcji. Drugi fragment bazy danych zawiera fragment pojedynczej kolekcji podrzędnej. Ten fragment pojedynczej kolekcji ma trzy podrzędne fragmenty dokumentów.
Każdy typ zasobu jest reprezentowany przez klasę języka Python. Oto najbardziej typowe klasy:
MongoClient — pierwszym krokiem podczas pracy z rozwiązaniem PyMongo jest utworzenie klienta MongoClient w celu nawiązania połączenia z interfejsem API usługi Azure Cosmos DB dla bazy danych MongoDB. Obiekt klienta służy do konfigurowania i wykonywania żądań względem usługi.
Baza danych — interfejs API usługi Azure Cosmos DB dla bazy danych MongoDB może obsługiwać co najmniej jedną niezależną bazę danych.
Kolekcja — baza danych może zawierać co najmniej jedną kolekcję. Kolekcja jest grupą dokumentów przechowywanych w bazie danych MongoDB i może być uważana za mniej więcej równoważną tabeli w relacyjnej bazie danych.
Dokument — dokument jest zestawem par klucz-wartość. Dokumenty mają schemat dynamiczny. Schemat dynamiczny oznacza, że dokumenty w tej samej kolekcji nie muszą mieć tego samego zestawu pól ani struktury. Typowe pola w dokumentach kolekcji mogą zawierać różne typy danych.
Aby dowiedzieć się więcej na temat hierarchii jednostek, zobacz artykuł Dotyczący modelu zasobów usługi Azure Cosmos DB.
Przykłady kodu
- Uwierzytelnianie użytkownika
- Pobieranie bazy danych
- Pobieranie kolekcji
- Tworzenie indeksu
- Tworzenie dokumentu
- Pobieranie dokumentu
- Wyszukiwanie w dokumentach
Przykładowy kod opisany w tym artykule tworzy bazę danych o nazwie z kolekcją o nazwie adventureworks
products
. Kolekcja została zaprojektowana products
tak, aby zawierała szczegóły produktu, takie jak nazwa, kategoria, ilość i wskaźnik sprzedaży. Każdy produkt zawiera również unikatowy identyfikator. Kompletny przykładowy kod znajduje się pod adresem https://github.com/Azure-Samples/azure-cosmos-db-mongodb-python-getting-started/tree/main/001-quickstart/.
W poniższych krokach baza danych nie będzie używać fragmentowania i pokazuje synchroniczną aplikację przy użyciu sterownika PyMongo . W przypadku aplikacji asynchronicznych należy użyć sterownika motorowego.
Uwierzytelnianie użytkownika
W katalogu projektu utwórz plik run.py . W edytorze dodaj instrukcje require, aby odwoływać się do pakietów, których będziesz używać, w tym pakietów PyMongo i python-dotenv.
import os import sys from random import randint import pymongo from dotenv import load_dotenv
Pobierz informacje o połączeniu ze zmiennej środowiskowej zdefiniowanej w pliku env .
load_dotenv() CONNECTION_STRING = os.environ.get("COSMOS_CONNECTION_STRING")
Zdefiniuj stałe, których będziesz używać w kodzie.
DB_NAME = "adventureworks" COLLECTION_NAME = "products"
Nawiązywanie połączenia z interfejsem API usługi Azure Cosmos DB dla bazy danych MongoDB
Użyj obiektu MongoClient, aby nawiązać połączenie z zasobem usługi Azure Cosmos DB dla bazy danych MongoDB. Metoda connect zwraca odwołanie do bazy danych.
client = pymongo.MongoClient(CONNECTION_STRING)
Pobieranie bazy danych
Sprawdź, czy baza danych istnieje z metodą list_database_names . Jeśli baza danych nie istnieje, użyj polecenia create database extension , aby utworzyć ją z określoną aprowizowaną przepływnością.
# 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))
Pobieranie kolekcji
Sprawdź, czy kolekcja istnieje z metodą list_collection_names . Jeśli kolekcja nie istnieje, użyj polecenia create collection extension, aby go utworzyć.
# 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))
Tworzenie indeksu
Utwórz indeks przy użyciu polecenia rozszerzenia kolekcji aktualizacji. Indeks można również ustawić w poleceniu create collection extension (Tworzenie rozszerzenia kolekcji). Ustaw indeks na name
właściwość w tym przykładzie, aby później można było sortować za pomocą metody sortowania klasy kursora w nazwie produktu.
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())))
Tworzenie dokumentu
Utwórz dokument z właściwościami produktu dla adventureworks
bazy danych:
- Właściwość category. Tej właściwości można użyć jako klucza partycji logicznej.
- Właściwość name .
- Właściwość ilości zapasów.
- Nieruchomość sprzedaży wskazująca, czy produkt jest w sprzedaży.
"""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))
Utwórz dokument w kolekcji, wywołując operację poziomu kolekcji update_one. W tym przykładzie utworzysz nowy dokument zamiast go utworzyć. W tym przykładzie funkcja Upsert nie jest konieczna, ponieważ nazwa produktu jest losowa. Jednak dobrym rozwiązaniem jest upsert w przypadku uruchomienia kodu więcej niż raz, a nazwa produktu jest taka sama.
Wynik update_one
operacji zawiera _id
wartość pola, której można użyć w kolejnych operacjach. Właściwość _id została utworzona automatycznie.
Pobieranie dokumentu
Użyj metody find_one, aby uzyskać dokument.
doc = collection.find_one({"_id": result.upserted_id})
print("Found a document with _id {}: {}\n".format(result.upserted_id, doc))
W usłudze Azure Cosmos DB można wykonać mniej kosztowną operację odczytu punktu przy użyciu zarówno unikatowego identyfikatora (_id
) jak i klucza partycji.
Dokumenty z zapytaniami
Po wstawieniu dokumentu można uruchomić zapytanie, aby pobrać wszystkie dokumenty pasujące do określonego filtru. W tym przykładzie znajdują się wszystkie dokumenty pasujące do określonej kategorii: gear-surf-surfboards
. Po zdefiniowaniu zapytania wywołaj Collection.find
metodę Cursor
, aby uzyskać wynik, a następnie użyj sortowania.
"""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))
Rozwiązywanie problemów:
- Jeśli wystąpi błąd, taki jak
The index path corresponding to the specified order-by item is excluded.
, upewnij się, że utworzono indeks.
Uruchamianie kodu
Ta aplikacja tworzy interfejs API dla bazy danych MongoDB i kolekcji oraz tworzy dokument, a następnie odczytuje dokładnie ten sam dokument z powrotem. Na koniec przykład powoduje problemy z zapytaniem, które zwraca dokumenty pasujące do określonej kategorii produktów. W każdym kroku przykład generuje informacje do konsoli o wykonanych krokach.
Aby uruchomić aplikację, użyj terminalu, aby przejść do katalogu aplikacji i uruchomić aplikację.
python run.py
Dane wyjściowe aplikacji powinny być podobne do tego przykładu:
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}
Czyszczenie zasobów
Jeśli nie potrzebujesz już konta usługi Azure Cosmos DB for NoSQL, możesz usunąć odpowiednią grupę zasobów.
Użyj polecenia , az group delete
aby usunąć grupę zasobów.
az group delete --name $resourceGroupName