Esercizi Query Avanzate MongoDB Python
- Esercizio 1: Aggregazione con Raggruppamento e Ordinamento
- Esercizio 2: Aggregazione con Filtraggio e Proiezione
- Esercizio 3: Aggregazione con Calcolo di Campo
- Esercizio 4: Ricerca Full-Text
- Esercizio 5: Query Geospaziale
- Esercizio 6: Utilizzo di Subquery
- Esercizio 7: Aggregazione con Condizioni Multiple
- Esercizio 8: Aggregazione con Unwind
Esercizi su query avanzate in MongoDB utilizzando la libreria Python pymongo
. Gli esercizi coprono vari aspetti delle query avanzate, inclusi aggregazioni complesse, subquery, ricerche full-text e utilizzo di indici geospaziali.
Esercizio 1: Aggregazione con Raggruppamento e Ordinamento
Utilizzare l'aggregazione per raggruppare i dipendenti per dipartimento e ordinare i risultati per numero di dipendenti in ogni dipartimento.
from pymongo import MongoClient
def aggregate_group_and_sort(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] collection = db['employees'] pipeline = [ {"$group": {"_id": "$department", "num_employees": {"$sum": 1}}}, {"$sort": {"num_employees": -1}} ] result = collection.aggregate(pipeline) for doc in result: print("Dipartimento:", doc["_id"], "Numero di dipendenti:", doc["num_employees"]) client.close()
aggregate_group_and_sort()
Esercizio 2: Aggregazione con Filtraggio e Proiezione
Utilizzare l'aggregazione per filtrare i dipendenti con più di 5 anni di esperienza e proiettare solo i campi "name" e "position".
from pymongo import MongoClient
def aggregate_filter_and_project(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] collection = db['employees'] pipeline = [ {"$match": {"years_of_experience": {"$gt": 5}}}, {"$project": {"name": 1, "position": 1, "_id": 0}} ] result = collection.aggregate(pipeline) for doc in result: print(doc) client.close()
aggregate_filter_and_project()
Esercizio 3: Aggregazione con Calcolo di Campo
Utilizzare l'aggregazione per aggiungere un campo calcolato "total_compensation" che è la somma di "salary" e "bonus".
from pymongo import MongoClient
def aggregate_with_computed_field(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] collection = db['employees'] pipeline = [ {"$project": {"name": 1, "salary": 1, "bonus": 1, "total_compensation": {"$sum": ["$salary", "$bonus"]}, "_id": 0}} ] result = collection.aggregate(pipeline) for doc in result: print(doc) client.close()
aggregate_with_computed_field()
Esercizio 4: Ricerca Full-Text
Eseguire una ricerca full-text sui documenti nella collezione "articles" utilizzando pymongo. Trovare tutti i documenti che contengono la parola "MongoDB".
from pymongo import MongoClient
def full_text_search(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] collection = db['articles'] collection.create_index([("content", "text")]) query = {"$text": {"$search": "MongoDB"}} result = collection.find(query) for doc in result: print(doc) client.close()
full_text_search()
Esercizio 5: Query Geospaziale
Eseguire una query geospaziale per trovare tutti i luoghi entro un raggio di 5 km da un punto specifico.
from pymongo import MongoClient
def geospatial_query(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] collection = db['places'] collection.create_index([("location", "2dsphere")]) query = { "location": { "$near": { "$geometry": {"type": "Point", "coordinates": [12.4964, 41.9028]}, "$maxDistance": 5000 } } } result = collection.find(query) for doc in result: print(doc) client.close()
geospatial_query()
Esercizio 6: Utilizzo di Subquery
Utilizzare una subquery per trovare tutti i dipendenti che hanno completato più di 3 progetti. Prima trovare gli ID dei dipendenti che hanno completato più di 3 progetti, poi utilizzare questi ID per trovare i dettagli dei dipendenti.
from pymongo import MongoClient
def subquery_example(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] projects_collection = db['projects'] employees_collection = db['employees']
# Trovare gli ID dei dipendenti che hanno completato più di 3 progetti pipeline = [ {"$group": {"_id": "$employee_id", "project_count": {"$sum": 1}}}, {"$match": {"project_count": {"$gt": 3}}} ] result = projects_collection.aggregate(pipeline) employee_ids = [doc["_id"] for doc in result]
# Utilizzare questi ID per trovare i dettagli dei dipendenti query = {"employee_id": {"$in": employee_ids}} employees = employees_collection.find(query) for employee in employees: print(employee) client.close()
subquery_example()
Esercizio 7: Aggregazione con Condizioni Multiple
Utilizzare l'aggregazione per trovare i dipendenti che lavorano nel dipartimento "Sales" e hanno un salario maggiore di 50000. Proiettare solo i campi "name" e "salary".
from pymongo import MongoClient
def aggregate_with_multiple_conditions(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] collection = db['employees'] pipeline = [ {"$match": {"department": "Sales", "salary": {"$gt": 50000}}}, {"$project": {"name": 1, "salary": 1, "_id": 0}} ] result = collection.aggregate(pipeline) for doc in result: print(doc) client.close()
aggregate_with_multiple_conditions()
Esercizio 8: Aggregazione con Unwind
Utilizzare l'aggregazione con l'operatore `$unwind` per de-normalizzare un array di documenti. Supponiamo che ogni documento "order" contenga un array "items". Creare una query che estrae ogni elemento dell'array "items" come un documento separato.
from pymongo import MongoClient
def aggregate_with_unwind(): client = MongoClient('mongodb://localhost:27017/') db = client['testdb'] collection = db['orders'] pipeline = [ {"$unwind": "$items"}, {"$project": {"order_id": 1, "item": "$items", "_id": 0}} ] result = collection.aggregate(pipeline) for doc in result: print(doc) client.close()
aggregate_with_unwind()