Guia de início rápido: Azure Cosmos DB para MongoDB para Python com driver MongoDB
APLICA-SE A: MongoDB
Comece a usar o pacote PyMongo para criar bancos de dados, coleções e documentos em seu recurso do Azure Cosmos DB. Siga estas etapas para instalar o pacote e experimentar o código de exemplo para tarefas básicas.
Nota
Os trechos de código de exemplo estão disponíveis no GitHub como um projeto Python.
Neste início rápido, você se comunicará com a API do Azure Cosmos DB para MongoDB usando um dos drivers de cliente MongoDB de código aberto para Python, PyMongo. Além disso, você usará os comandos de extensão do MongoDB, que são projetados para ajudá-lo a criar e obter recursos de banco de dados específicos para o modelo de capacidade do Azure Cosmos DB.
Pré-requisitos
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.
- Python 3.8+
- Interface de linha de comando (CLI) do Azure ou Azure PowerShell
Verificação de pré-requisitos
- Em um terminal ou janela de comando, execute
python --version
para verificar se você tem uma versão recente do Python. - Execute
az --version
(CLI do Azure) ouGet-Module -ListAvailable Az*
(Azure PowerShell) para verificar se você tem as ferramentas de linha de comando apropriadas do Azure instaladas.
Configuração
Esta seção orienta você na criação de uma conta do Azure Cosmos DB e na configuração de um projeto que usa o pacote npm do MongoDB.
Criar uma conta do Azure Cosmos DB
Este início rápido criará uma única conta do Azure Cosmos DB usando a API para MongoDB.
Crie variáveis de shell para accountName, resourceGroupName e 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"
Se ainda não o fez, entre na CLI do Azure usando o
az login
comando.Use o
az group create
comando para criar um novo grupo de recursos em sua assinatura.az group create \ --name $resourceGroupName \ --location $location
Use o
az cosmosdb create
comando para criar uma nova conta do Azure Cosmos DB para MongoDB com configurações padrão.az cosmosdb create \ --resource-group $resourceGroupName \ --name $accountName \ --locations regionName=$location --kind MongoDB
Obter a cadeia de ligação do MongoDB
Encontre a API para a cadeia de conexão do MongoDB na lista de cadeias de conexão da conta com o
az cosmosdb keys list
comando.az cosmosdb keys list --type connection-strings \ --resource-group $resourceGroupName \ --name $accountName
Registre os valores de CHAVE PRIMÁRIA . Você usará essas credenciais mais tarde.
Criar um novo aplicativo Python
Crie uma nova pasta vazia usando seu terminal preferido e altere o diretório para a pasta.
Nota
Se você quiser apenas o código concluído, baixe ou bifurque e clone o repositório de trechos de código de exemplo que tem o exemplo completo. Você também
git clone
pode usar o repositório no Azure Cloud Shell para percorrer as etapas mostradas neste início rápido.Crie um arquivo requirements.txt que liste os pacotes PyMongo e python-dotenv .
# requirements.txt pymongo python-dotenv
Crie um ambiente virtual e instale os pacotes.
# 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
Configurar variáveis de ambiente
Para usar os valores CONNECTION STRING dentro do seu código, defina esse valor no ambiente local que executa o aplicativo. Para definir a variável de ambiente, use seu terminal preferido para executar os seguintes comandos:
$env:COSMOS_CONNECTION_STRING = "<cosmos-connection-string>"
Modelo de objeto
Vamos examinar a hierarquia de recursos na API do MongoDB e o modelo de objeto usado para criar e acessar esses recursos. O Azure Cosmos DB cria recursos em uma hierarquia que consiste em contas, bancos de dados, coleções e documentos.
Diagrama hierárquico mostrando uma conta do Azure Cosmos DB na parte superior. A conta tem dois fragmentos de banco de dados filho. Um dos fragmentos de banco de dados inclui dois fragmentos de coleção filho. O outro fragmento de banco de dados inclui um único fragmento de coleção filho. Esse único fragmento de coleção tem três fragmentos de doc filho.
Cada tipo de recurso é representado por uma classe Python. Aqui estão as classes mais comuns:
MongoClient - A primeira etapa ao trabalhar com o PyMongo é criar um MongoClient para se conectar à API do Azure Cosmos DB para MongoDB. O objeto cliente é usado para configurar e executar solicitações no serviço.
Banco de dados - A API do Azure Cosmos DB para MongoDB pode dar suporte a um ou mais bancos de dados independentes.
Coleção - Um banco de dados pode conter uma ou mais coleções. Uma coleção é um grupo de documentos armazenados no MongoDB, e pode ser pensado como aproximadamente o equivalente a uma tabela em um banco de dados relacional.
Documento - Um documento é um conjunto de pares chave-valor. Os documentos têm esquema dinâmico. Esquema dinâmico significa que os documentos na mesma coleção não precisam ter o mesmo conjunto de campos ou estrutura. E os campos comuns nos documentos de uma coleção podem conter diferentes tipos de dados.
Para saber mais sobre a hierarquia de entidades, consulte o artigo Modelo de recursos do Azure Cosmos DB.
Exemplos de código
- Autenticar o cliente
- Obter base de dados
- Obter coleção
- Criar um índice
- Criar um documento
- Obter um documento
- Consultar documentos
O código de exemplo descrito neste artigo cria um banco de dados nomeado adventureworks
com uma coleção chamada products
. A products
coleção foi projetada para conter detalhes do produto, como nome, categoria, quantidade e um indicador de venda. Cada produto também contém um identificador exclusivo. O código de exemplo completo está em https://github.com/Azure-Samples/azure-cosmos-db-mongodb-python-getting-started/tree/main/001-quickstart/.
Para as etapas abaixo, o banco de dados não usará fragmentação e mostra um aplicativo síncrono usando o driver PyMongo . Para aplicações assíncronas, use o driver do motor .
Autenticar o cliente
No diretório do projeto, crie um arquivo run.py . No seu editor, adicione instruções require aos pacotes de referência que você usará, incluindo os pacotes PyMongo e python-dotenv.
import os import sys from random import randint import pymongo from dotenv import load_dotenv
Obtenha as informações de conexão da variável de ambiente definida em um arquivo .env .
load_dotenv() CONNECTION_STRING = os.environ.get("COSMOS_CONNECTION_STRING")
Defina constantes que você usará no código.
DB_NAME = "adventureworks" COLLECTION_NAME = "products"
Conectar-se à API do Azure Cosmos DB para MongoDB
Use o objeto MongoClient para se conectar ao seu recurso do Azure Cosmos DB for MongoDB. O método connect retorna uma referência ao banco de dados.
client = pymongo.MongoClient(CONNECTION_STRING)
Obter base de dados
Verifique se o banco de dados existe com list_database_names método. Se o banco de dados não existir, use o comando create database extension para criá-lo com uma taxa de transferência provisionada especificada.
# 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))
Obter coleção
Verifique se a coleção existe com o método list_collection_names . Se a coleção não existir, use o comando create collection extension para criá-la.
# 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))
Criar um índice
Crie um índice usando o comando update collection extension. Você também pode definir o índice no comando create collection extension. Defina a propriedade index to name
neste exemplo para que você possa classificar posteriormente com o método de classificação de classe de cursor no nome do produto.
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())))
Criar um documento
Crie um documento com as propriedades do produto para o adventureworks
banco de dados:
- Uma propriedade de categoria . Esta propriedade pode ser usada como a chave de partição lógica.
- Uma propriedade name .
- Uma propriedade de quantidade de inventário.
- Uma propriedade de venda, indicando se o produto está à venda .
"""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))
Crie um documento na coleção chamando a operação de nível de coleção de update_one. Neste exemplo, você atualizará em vez de criar um novo documento. Upsert não é necessário neste exemplo porque o nome do produto é aleatório. No entanto, é uma boa prática fazer upsert caso você execute o código mais de uma vez e o nome do produto seja o mesmo.
O resultado da operação contém o update_one
_id
valor de campo que você pode usar em operações subsequentes. A propriedade _id foi criada automaticamente.
Obter um documento
Use o método find_one para obter um documento.
doc = collection.find_one({"_id": result.upserted_id})
print("Found a document with _id {}: {}\n".format(result.upserted_id, doc))
No Azure Cosmos DB, você pode executar uma operação de leitura pontual menos dispendiosa usando o identificador exclusivo (_id
) e uma chave de partição.
Consultar documentos
Depois de inserir um documento, você pode executar uma consulta para obter todos os documentos que correspondem a um filtro específico. Este exemplo localiza todos os documentos que correspondem a uma categoria específica: gear-surf-surfboards
. Depois que a consulta estiver definida, ligue Collection.find
para obter um Cursor
resultado e, em seguida, use a classificação.
"""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))
Resolva os problemas:
- Se você receber um erro como
The index path corresponding to the specified order-by item is excluded.
, certifique-se de ter criado o índice.
Executar o código
Este aplicativo cria uma API para banco de dados e coleção MongoDB e cria um documento e, em seguida, lê exatamente o mesmo documento de volta. Finalmente, o exemplo emite uma consulta que retorna documentos que correspondem a uma categoria de produto especificada. Com cada etapa, o exemplo envia informações para o console sobre as etapas executadas.
Para executar o aplicativo, use um terminal para navegar até o diretório do aplicativo e executar o aplicativo.
python run.py
A saída do aplicativo deve ser semelhante a este exemplo:
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}
Clean up resources (Limpar recursos)
Quando não precisar mais da conta do Azure Cosmos DB para NoSQL, você poderá excluir o grupo de recursos correspondente.
Use o comando para excluir o az group delete
grupo de recursos.
az group delete --name $resourceGroupName