MongoDB avec PyMongo¶
Installation du package¶
Utiliser pip pour installer pymongo
pip install pymongo
Vérifier l'installation
from pymongo import MongoClient
Si aucune erreur n'est apparue, alors l'installation est réussie.
Exemple¶
Dataset
Pour que les exemples s'exécutent correctement, le fichier json flights-20k.json doit être importé dans la base de données flightstats et la collection flights.
Le code des exemples qui suivent est disponible en format Notebook Jupyter : Pymongo.ipynb
Se connecter au serveur MongoDB¶
from pymongo import MongoClient
client = MongoClient("localhost", 27017)
Afficher les BD disponibles¶
client.list_database_names()
Sélectionner une bases de données¶
db = client['flightstats']
# le choix du bd permet de retrouver la même syntaxe que le shell de MongoDB
Afficher les collections¶
db.list_collection_names()
['flights']
Nombre de document d'une collection¶
db.flights.count_documents({})
20000
Afficher un document¶
from pprint import pprint
pprint(db.flights.find_one())
{'_id': ObjectId('634727c85afd6caa6fed4c9e'),
'date': '2001/01/13 14:56',
'delay': 32,
'destination': 'SJC',
'distance': 417,
'origin': 'SAN'}
Insertion¶
myflight = { 'date': '2022/10/10 10:15',
'delay': 12,
'destination': 'SJC',
'distance': 417,
'origin': 'SAN'}
new_id = db.flights.insert_one(myflight).inserted_id
print(new_id)
634742d03646634ba81c9855
Recherche par _id¶
# Remplacer la valeur _id par la sortie de la cellule précédente
db.flights.count_documents({"_id":"634742d03646634ba81c9855"})
0
db.flights.count_documents({"_id":new_id})
1
from bson.objectid import ObjectId
# Remplacer la valeur _id par la sortie de la cellule d'insertion de document
db.flights.count_documents({"_id":ObjectId("634742d03646634ba81c9855")})
1
Supprimer¶
res = db.flights.delete_one({"_id":new_id})
# Nombre de documents supprimés
res.deleted_count
1
Recherche¶
# Les vols ayant un retard compris entre 60 et 61 minutes trié par le retard
res = db.flights.find({"$and" :[{"delay":{"$gte":60}},{"delay":{"$lte":61}}]}).sort("delay")
for fl in res:
print(f"{fl['origin']}-{fl['destination']}: {fl['delay']}")
SJC-LAS: 60
SJC-MCI: 60
FLL-JAX: 60
ONT-PHX: 60
SFO-SAN: 60
OAK-LAX: 60
MDW-STL: 60
LAS-ONT: 60
OKC-MCI: 60
DAL-AMA: 60
SAN-TUS: 60
PHX-BHM: 60
PHX-ABQ: 60
BWI-CLE: 60
MHT-BWI: 60
BUR-OAK: 60
BNA-MDW: 60
LAS-SLC: 60
BWI-BNA: 60
SJC-BUR: 60
ISP-TPA: 60
PDX-BOI: 60
LAX-PHX: 60
OAK-SEA: 60
ABQ-PHX: 60
RNO-OAK: 60
SLC-PHX: 60
SAN-ELP: 60
OAK-LAX: 60
SFO-PHX: 60
SMF-BUR: 60
MDW-BHM: 60
OAK-LAX: 60
SAN-PHX: 60
MCI-PHX: 60
ABQ-PHX: 60
IAH-DAL: 60
PHX-ONT: 60
HOU-CRP: 60
SJC-LAX: 60
HOU-SAT: 60
STL-HOU: 60
MCI-BWI: 60
RNO-OAK: 60
SNA-SJC: 60
SLC-OAK: 60
DAL-AMA: 60
SFO-PHX: 60
ONT-PHX: 61
ELP-AUS: 61
HOU-MSY: 61
BWI-MCO: 61
MCI-MDW: 61
Agrégation et visualisation du résultat¶
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
#Calculer le retard par aéoroport de départ et afficher 5 premiers
pipeline = [
{"$group": {"_id": "$origin", "moyenne": {"$avg": "$delay"}}},
{"$sort": {"moyenne":-1}},
{"$limit":5}]
res = db.flights.aggregate(pipeline)
df = pd.DataFrame(list(res))
df.rename({"_id":"Aéroport"}, axis=1, inplace=True)
sns.barplot(data=df, y="moyenne", x="Aéroport")
plt.show()
Exercice
¶
-
Ecrire un programme Python qui permet de charger le contenu du fichier CSV airports.csv dans MongoDB selon 2 modélisations : normalisée et dénormalisée.
-
Vérifier le temps d'exécution de la requête permettant d'afficher la ville de chaque aéroport dans chacune des modélisation.