Menu Docs
Página inicial do Docs
/ / /
PyMongo
/ /

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

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

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 utiliza uma collection, persons, que contém documento que descrevem pessoas. Cada documento inclui o nome da pessoa, a data de nascimento, a função e outros detalhes.

Antes de iniciar este tutorial, conclua as instruções do Aplicativo modelo de agregação para configurar um aplicativo Python funcional.

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)
1

Primeiro, adicione um estágio $match que encontra documentos nos quais o valor do campo vocation é "ENGINEER":

pipeline.append({
"$match": {
"vocation": "ENGINEER"
}
})
2

Em seguida, adicione um estágio $sort que classifica os documentos em ordem decrescente pelo campo dateofbirth para listar primeiro os mais jovens. Como os dicionários Python não mantêm a ordem de seus elementos, use um objeto SON``or ``OrderedDict :

pipeline.append({
"$sort": {
"dateofbirth": -1
}
})
3

Em seguida, adicione um estágio $limit ao pipeline para produzir apenas os três primeiros documentos nos resultados.

pipeline.append({
"$limit": 3
})
4

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.

5

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection persons :

aggregation_result = person_coll.aggregate(pipeline)

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

python3 agg_tutorial.py
6

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.

Voltar

Tutoriais de agregação

Próximo

Grupo e total