Subconjunto filtrado
Nesta página
- Introdução
- Resumo da tarefa de agregação
- Antes de começar
- Tutorial
- Adicionar um estágio de partida para pessoas que são engenheiras
- Adicione um estágio de classificação para ordenar do mais novo para o mais antigo
- Adicione um estágio de limite para ver apenas três resultados
- Adicione um estágio não definido para remover campos desnecessários
- Executar o pipeline de agregação
- Interpretar resultados
Introdução
Neste tutorial, você pode aprender como usar o PyMongo para construir um pipeline de agregação, executar a agregação em uma coleção e imprimir os resultados concluindo e executando um aplicativo de exemplo. Essa agregação executa as seguintes operações:
Corresponde a um subconjunto de documentos pelo valor de um campo
Formata documentos de resultado
Resumo da tarefa de agregação
Este tutorial demonstra como executar uma query em um subconjunto específico de documentos em uma coleção. Os resultados contém documentos acerca das três pessoas mais jovens que têm a Engenharia como profissão.
Este exemplo usa uma collection, persons
, que contém documento descrevendo pessoas. Cada documento inclui o nome da pessoa, data de nascimento, vocação e outros detalhes.
Antes de começar
Antes de começar a seguir um tutorial de agregação, você deve configurar um novo aplicativo Python. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB, inserir dados de amostra no MongoDB e executar o aggregation pipeline em cada tutorial.
Dica
Para saber como instalar o driver e se conectar ao MongoDB, consulte Introdução ao PyMongo
Após instalar o driver, crie um arquivo chamado agg_tutorial.py
. Cole o seguinte código neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação:
from pymongo import MongoClient # Replace the placeholder with your connection string. uri = "<connection string>" client = MongoClient(uri) try: agg_db = client["agg_tutorials_db"] # Get a reference to relevant collections. # ... some_coll = # ... another_coll = # Delete any existing documents in collections. # ... some_coll.delete_many({}) # Insert sample data into the collection or collections. # ... some_data = [...] # ... some_coll.insert_many(some_data) # Create an empty pipeline array. pipeline = [] # Add code to create pipeline stages. # ... pipeline.append({...}) # Run the aggregation. # ... aggregation_result = ... # Print the aggregation results. for document in aggregation_result: print(document) finally: client.close()
Importante
No código anterior, leia os comentários de código para localizar as seções do código que você deve modificar para o tutorial que você está seguindo.
Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.
Para cada tutorial, você deve substituir o espaço reservado da connection string de conexão pela string de conexão do seu sistema. Para saber como localizar a connection string do seu sistema, consulte Criar uma connection string.
Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017"
, sua atribuição de string de conexão será semelhante à seguinte:
uri = "mongodb+srv://mongodb-example:27017";
Para executar o arquivo completo após modificar o modelo de um tutorial, execute o seguinte comando em seu shell:
python3 agg_tutorial.py
Depois de configurar o aplicativo, acesse a coleção persons
adicionando o seguinte código ao aplicativo:
person_coll = agg_db["persons"]
Exclua todos os dados existentes nas coleções e insira dados de amostra na coleção persons
, conforme mostrado no código a seguir:
person_coll.delete_many({}) person_data = [ { "person_id": "6392529400", "firstname": "Elise", "lastname": "Smith", "dateofbirth": datetime(1972, 1, 13, 9, 32, 7), "vocation": "ENGINEER", "address": { "number": 5625, "street": "Tipa Circle", "city": "Wojzinmoj", } }, { "person_id": "1723338115", "firstname": "Olive", "lastname": "Ranieri", "dateofbirth": datetime(1985, 5, 12, 23, 14, 30), "gender": "FEMALE", "vocation": "ENGINEER", "address": { "number": 9303, "street": "Mele Circle", "city": "Tobihbo", } }, { "person_id": "8732762874", "firstname": "Toni", "lastname": "Jones", "dateofbirth": datetime(1991, 11, 23, 16, 53, 56), "vocation": "POLITICIAN", "address": { "number": 1, "street": "High Street", "city": "Upper Abbeywoodington", } }, { "person_id": "7363629563", "firstname": "Bert", "lastname": "Gooding", "dateofbirth": datetime(1941, 4, 7, 22, 11, 52), "vocation": "FLORIST", "address": { "number": 13, "street": "Upper Bold Road", "city": "Redringtonville", } }, { "person_id": "1029648329", "firstname": "Sophie", "lastname": "Celements", "dateofbirth": datetime(1959, 7, 6, 17, 35, 45), "vocation": "ENGINEER", "address": { "number": 5, "street": "Innings Close", "city": "Basilbridge", } }, { "person_id": "7363626383", "firstname": "Carl", "lastname": "Simmons", "dateofbirth": datetime(1998, 12, 26, 13, 13, 55), "vocation": "ENGINEER", "address": { "number": 187, "street": "Hillside Road", "city": "Kenningford", } } ] person_coll.insert_many(person_data)
Tutorial
Adicionar um estágio de partida para pessoas que são engenheiras
Primeiro, adicione um estágio $match que encontra documentos nos quais o valor do campo vocation
é "ENGINEER"
:
pipeline.append({ "$match": { "vocation": "ENGINEER" } })
Adicione um estágio de classificação para ordenar do mais novo para o mais antigo
Em seguida, adicione um estágio $sort que classifica os documentos em ordem decrescente pelo campo dateofbirth
para listar primeiro as pessoas mais jovens:
pipeline.append({ "$sort": { "dateofbirth": -1 } })
Adicione um estágio de limite para ver apenas três resultados
Em seguida, adicione um estágio $limit ao pipeline para produzir apenas os três primeiros documentos nos resultados.
pipeline.append({ "$limit": 3 })
Adicione um estágio não definido para remover campos desnecessários
Finalmente, adicione um estágio $unset . O estágio $unset
remove campos desnecessários dos documentos de resultado:
pipeline.append({ "$unset": [ "_id", "address" ] })
Dica
Use o operador $unset
, não o $project
, para evitar modificar o pipeline de agregação caso documentos com campos diferentes sejam adicionados à coleção.
Interpretar resultados
O resultado agregado contém três documentos. Os documentos representam as três pessoas mais jovens que têm a profissão de "ENGINEER"
. Os resultados são ordenados mostrando a pessoa mais jovem primeiro e a pessoa mais velha por último. Os resultados omitem os campos _id
e address
.
{ 'person_id': '7363626383', 'firstname': 'Carl', 'lastname': 'Simmons', 'dateofbirth': datetime.datetime(1998, 12, 26, 13, 13, 55), 'vocation': 'ENGINEER' } { 'person_id': '1723338115', 'firstname': 'Olive', 'lastname': 'Ranieri', 'dateofbirth': datetime.datetime(1985, 5, 12, 23, 14, 30), 'gender': 'FEMALE', 'vocation': 'ENGINEER' } { 'person_id': '6392529400', 'firstname': 'Elise', 'lastname': 'Smith', 'dateofbirth': datetime.datetime(1972, 1, 13, 9, 32, 7), 'vocation': 'ENGINEER' }
Para visualizar o código completo deste tutorial, consulte o Aplicativo de subconjunto filtrado concluído no Github.