ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Menu Docs

Subconjunto filtrado

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 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 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)
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 as pessoas mais jovens:

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.