ALEXANDRE LOUVET


Sujet de TP : MongoDB

S1 2026-2027 - IUT - University de Lille, BUT3 SD

TP MongoDB

Modèle de données & Initialisation

Charger la base de données à partir du fichier tracks.json.

Script d'initialisation (setup_db.py)

Ce script lit le fichier tracks.json présent dans le même dossier et remplit la collection tracks de la base streampulse :

import json
from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017/")
db = client["streampulse"]
collection = db["tracks"]

# Réinitialisation de la collection pour repartir sur une base propre
collection.drop()

# Chargement du fichier JSON distribué
with open("tracks.json", "r", encoding="utf-8") as f:
    sample_data = json.load(f)

collection.insert_many(sample_data)
print(f"Base 'streampulse' initialisée avec {collection.count_documents({})} pistes.")

Partie 1 : Connexion et vérification de l'environnement

Documentation

Exercices

  1. Initialisation : Place le fichier tracks.json dans ton dossier de travail, exécute setup_db.py, et affiche la liste des bases de données.
  2. Volumétrie : Affiche le nombre total de morceaux importés.
  3. Comptage filtré : Compte combien de morceaux sont sortis strictly après 2020. (Indice : Tu peux résoudre ceci via une fonction PyMongo de comptage direct ou via une requête de recherche standard dont tu calcules la taille).
  4. Comptage booléen : Calcule le nombre de pistes marquées comme explicites (explicit).

Partie 2 : Insertions et Lectures de base

Documentation

Exercices

  1. Insertion unique : Insère le titre "One More Time" de Daft Punk (isrc: "FRX99999", year: 2000, duration_sec: 320, metrics: {"plays": 5000000, "likes": 300000}, genres: ["French Touch", "Disco"], tags: ["classic"], explicit: False, comments: []). Affiche l'ID généré.
  2. Insertion multiple : Insère d'un seul coup 3 nouveaux morceaux de l'artiste "Justice".
  3. Recherche ponctuelle : Récupère la piste ayant l'ISRC "FRX00010" et affiche ses données. Que se passe-t-il si tu cherches un ISRC inexistant ?
  4. Recherche avec projection : Affiche la liste des morceaux sortis en 2015. L'affichage ne doit contenir que le titre, l'artiste et l'année (sans le champ _id).
  5. Recherche conditionnelle (Plusieurs approches possibles) : Récupère uniquement 5 morceaux durant plus de 300 secondes. (Indice : Tu peux limiter le nombre de résultats directement dans ta requête MongoDB ou en utilisant des fonctionnalités natives de Python sur le curseur).

Partie 3 : Requêtes avancées

Documentation

Exercices

  1. Filtres numériques : Trouve toutes les pistes sorties entre 2010 et 2015 (inclus) ayant une durée strictement inférieure à 200 secondes.
  2. Recherche multi-valeurs : Sélectionne tous les morceaux des artistes "Kavinsky", "Air" ou "Phoenix". (Essaie d'écrire une syntaxe optimisée pour vérifier l'appartenance à un ensemble, puis une alternative avec des conditions disjonctives).
  3. Combinaisons logiques : Trouve les morceaux qui ont soit plus de 2 000 000 d'écoutes, soit plus de 100 000 likes.
  4. Combinaison logique complexe : Extrais les morceaux sortis après 2018 ET appartenant soit au genre "Indie Pop", soit au genre "Synthwave".
  5. Recherche dans un tableau simple : Trouve tous les morceaux possédant à la fois les tags "night" ET "chill".
  6. Taille de tableau : Trouve les morceaux qui ont exactement 3 tags.
  7. Tableaux d'objets (Deux méthodes à comparer) :

Partie 4 : Mises à jour et Suppressions

Documentation

Exercices

  1. Mise à jour ponctuelle de compteurs : Le morceau "FRX00005" est joué une fois. Incrémente son nombre de lectures de 1 et ajoute 5 likes.
  2. Ajout dans un tableau sans doublon : Ajoute le genre "Lo-Fi" au morceau "FRX00002". Assure-toi que relancer le script ne crée pas de doublons dans le tableau.
  3. Ajout dans un tableau d'objets : Ajoute un commentaire {"user": "charlie_p", "text": "Super !", "rating": 5} sur le morceau "FRX00003".
  4. Retrait d'un élément de tableau : Retire le tag "workout" du morceau "FRX00004".
  5. Mise à jour globale (Plusieurs approches possibles) : Ajoute 10 000 écoutes à toutes les pistes de l'artiste "Daft Punk". (Réalise cette action via une commande Mongo globale, puis envisage comment cela aurait été fait en itérant côté Python).
  6. Nettoyage : Supprime tous les morceaux ayant strictement moins de 5 000 écoutes.

Partie 5 : Framework d'Agrégation et Indexation

Documentation

Exercices

Partie A : Agrégations

  1. Statistiques globales (Plusieurs approches possibles) : Calcule le nombre total de morceaux par artiste ainsi que leur nombre moyen de likes. Trie du plus populaire au moins populaire. (Résous cela avec le pipeline d'agrégation MongoDB, puis imagine comment le faire en Python avec find()).
  2. Analyse de tableaux : Calcule le nombre de pistes associées à chaque genre (sachant qu'un morceau a plusieurs genres). Affiche les 3 genres les plus représentés.
  3. Pipeline complet : Pour les morceaux sortis à partir de 2010, calcule la note moyenne des commentaires reçus par artiste. Affiche le TOP 5 des artistes les mieux notés.
  4. Durée totale du catalogue par année : Écris un pipeline qui calcule la durée totale d'écoute disponible (en secondes) ainsi que la durée moyenne d'un morceau pour chaque année de sortie (year). Affiche les résultats triés par année croissante.
  5. Filtre post-agrégation (Artistes prolifiques) : Écris un pipeline d'agrégation qui compte le nombre de morceaux par artiste, puis conserve uniquement les artistes ayant produit au moins 50 morceaux. (Indice : Réfléchis à la place de l'étape de filtrage dans le pipeline).
  6. Ratio d'engagement par morceau : Crée un pipeline qui ajoute un champ calculé like_rate correspondant au nombre de likes divisé par le nombre d'écoutes (metrics.likes / metrics.plays). Affiche les 5 morceaux ayant le meilleur taux d'engagement.
  7. Activité des utilisateurs (Commentateurs) : À partir du tableau d'objets comments, identifie les 3 utilisateurs (user) ayant laissé le plus grand nombre de commentaires sur l'ensemble de la plateforme.

Partie B : Performance & Indexation

  1. Diagnostic sans index : Mesure le temps d'exécution d'une recherche par isrc (ex: "FRX00250"). Utilise la méthode .explain("executionStats") pour inspecter le nombre de documents scannés (totalDocsExamined) et la stratégie (COLLSCAN).
  2. Optimisation unique : Pose une contrainte d'indexation unique sur isrc. Relance le diagnostic et compare le résultat (IXSCAN).
  3. Index composé : Crée un index sur l'artiste (croissant) et l'année (décroissant). Teste une requête filtrant sur l'artiste et triant par année. Explicite dans ton rapport la règle des préfixes d'index.