🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Esercizi Query Avanzate MongoDB Python

Codegrind Team•Jul 10 2024

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