Les requĂȘtes Mongo DB
Câest quoi une requĂȘte ?
Pour utiliser ta base de donnĂ©es, tu devras faire des requĂȘtes. Les opĂ©rations les plus courantes sont :
- Créer une nouvelle entrée sur la base données (on dit aussi insérer)
- Récupérer et lire les informations sur la base de données
- Mettre à jour (=changer les valeurs) des informations sur la base de données
- Supprimer des informations sur la base de données.
En anglais, on regroupe souvent ces 4 opérations sous le terme CRUD (Create Read Update Delete, ce qui signifie « Créer Lire Mettre à jour Supprimer »).
Insérer une nouvelle donnée
Pour insĂ©rer une nouvelle donnĂ©e, il suffit dâutiliser la fonction insert_one sur notre base de donnĂ©e et de lui passer en paramĂštre le dictionnaire que lâon veut insĂ©rer.
Il est important de bien comprendre comment fonctionne la ligne ci-dessus.
- db_toto est une variable qui correspond Ă Â la collection sur laquelle tu souhaites faire une opĂ©ration. Cela signifie que quelque part dans le code, on a dĂ©jĂ rĂ©cupĂ©rĂ© l’accĂšs Ă cette collection et on l’a stockĂ© dans cette variable !
- insert_one() est la fonction que l’on va utiliser – en l’occurence, cette fonction permet d’insĂ©rer une nouvelle donnĂ©e.
- Entre les {}, c’est notre filtre de requĂȘte. Cela permet de filtrer les documents pour rĂ©cupĂ©rer uniquement ceux qui nous intĂ©ressent. Autrement dit, cela permet de prĂ©ciser notre requĂȘte ! Qu’est-ce que je souhaite insĂ©rer ? Ou dans le cas de la fonction find(), quels documents est-ce que souhaite rĂ©cupĂ©rer ? etc.
Tu verras que les autres fonctions (find(), update_one(), delete()… ) fonctionnent toutes avec le mĂȘme principe !
Quelque part dans mon code, je pense Ă stocker lâaccĂšs Ă ma collection dans une variableâŠ
(ici appelée db_utilisateurs dans cet exemple)
⊠puis je peux alors Ă©crire mes requĂȘtes ! Ci-dessous, un exemple oĂč un nouvel utilisateur est ajoutĂ© dans la base de donnĂ©es.
Ă gauche, le code pour insĂ©rer un nouvel utilisateur. Ă droite, on peut voir que lâentrĂ©e a bien Ă©tĂ© ajoutĂ©e sur la base de donnĂ©es.
Note : Il sâagit ici juste dâun exemple. InsĂ©rer un mot de passe sans le chiffrer dans une base de donnĂ©es est une trĂšs mauvaise pratique đ
Â
Tu noteras quâon a mis un commentaire Ă cĂŽtĂ© de chaque champ pour se rappeler Ă quoi il correspond. Quand on insĂšre une donnĂ©e pour la premiĂšre fois, câest une bonne pratique de noter les diffĂ©rents champs de la base de donnĂ©es, pour sâen souvenir pour les prochaines fois !
Attention, la fonction insert() nâest plus maintenue, si tu trouve du code lâutilisant il faut la remplacer par insert_one()
Récupérer des données
Il existe de multiples maniĂšres de rĂ©cupĂ©rer les donnĂ©es selon ce que lâon veut faire. En voici quelques-unes.
Récupérer toutes les données
Pour récupérer toutes les données on utilise la fonction find() sur un dictionnaire vide.
Note : Si jamais tu as besoin de faire des opĂ©rations sur les donnĂ©es ainsi rĂ©cupĂ©rĂ©es dans ton code Python, pense Ă dâabord les convertir en liste avec la fonction list() .
Cependant, dans la plupart des cas tu nâas pas besoin de le faire vu que les donnĂ©es sont simplement transmises Ă la page web qui lâaffichera !
Récupérer toutes les données
Pour rĂ©cupĂ©rer toutes les donnĂ©es dont la clef Ă une certaine valeur on utilise la fonction find en prĂ©cisant la clef et la valeur que lâon veut chercher. Les {} correspondent en effet au filtre de la requĂȘte, ce que lâon Ă©crit Ă lâintĂ©rieur permet de filtrer les rĂ©sultats pour obtenir ce que lâon souhaite !
Un autre exemple oĂč on rĂ©cupĂšre tous les utilisateurs dont lâĂąge est de 18
Récupérer une donnée dont une clef a une certaine valeur
Cette fois on utilise la fonction find_one() en prĂ©cisant la clef et la valeur de lâon veut chercher
Récupérer toutes les données dont une clef contient un mot
Dans les deux cas prĂ©cĂ©dents on cherche si la valeur est exactement la mĂȘme. LĂ on veut juste quâil y ait un mot qui apparaisse dans la valeur.
Pour cela on va dâabord dire que notre clef est une clef de type de texte avec la fonction create_index :
db_toto.create_index( [ ('champ', 'text' ) ] )Puis on va faire une recherche sur toutes les clefs de type texte avec la syntaxe suivante :
resultat = db_nom_base.find( { '$text' : { '$search' : 'mot_a_chercher' }} ) Et encore…
Il existe plein dâautres maniĂšres de rechercher des donnĂ©es, et on peut faire plein dâautres choses, modifier des donnĂ©es , les trier, les supprimer etc. Pour dĂ©couvrir toutes les fonctions utilisables tu peux consulter la doc :
https://api.mongodb.com/python/current/api/pymongo/collection.html
Mettre à jour une donnée
Pour modifier une donnĂ©e, on va utiliser la fonction update_one() sur lâune des lignes de son choix, avec les nouvelles valeurs de son choix.
Pour cela on va dĂ©ja devoir rĂ©cupĂ©rer la donnĂ©e que lâon veux modifier avec une requĂȘte. Pour ĂȘtre sur de modifier la bonne donnĂ©e, on sâarrangera pour faire une requĂȘte sur un champ unique. Le pseudo par exemple, ou lâID.
Pour lâexemple, on va modifier le mot de passe dâun utilisateur.
On donc lâutilisateur Ă modifier, et la donnĂ©e qui contient cette utilisateur.
Ensuite, il ne reste quâĂ dĂ©finir la modification que lâon souhaite faire.
{« $set »:{âmotDePasseâ:NouveauMDP}}
Ici on définit la nouvelle valeur du champ motDePasse.
Ensuite on utilise la fonction update_one(), avec la requĂȘte de donnĂ©e et la modification Ă faire.
Supprimer une donnée
Pour supprimer une donnée, on va utiliser la fonction delete_one() sur le champ et la valeur de son choix
Pour éviter de supprimer la mauvaise donnée, on peut utiliser la clé _id qui est unique pour chaque document.
Par dĂ©faut, la valeur d’un champ est une chaine de caractĂšre (exemple une variable). Quand on rĂ©cupĂšre la valeur de lâid, le type de la valeur attendue est un objet, et on utilise ObjectId.Â
Pour transformer la chaine en ObjectId, il faut importer la librairie suivante :
On doit crĂ©er une route par id, pour cibler un document prĂ©cis (celui que l’on veut supprimer)
Appeler l’id en paramĂštre de la mĂ©thode de la route, via une variable de ton choix
Et utiliser la fonction ObjectId() dans la valeur de la requĂȘte en joignant le paramĂštre id_post
Opérateurs binaires
Il arrive que lâon cherche Ă faire des requĂȘtes un peu plus compliquĂ©es. Par exemple, « rĂ©cupĂ©rer tous les utilisateurs qui dont le pseudo contient Alice ET qui sont connectĂ©s ». Ou encore « mettre Ă jour le champ âcouleurâ de tous les posts qui datent du 24 DĂ©cembre OU du 25 DĂ©cembre ».
Ce genre de requĂȘte utilise des opĂ©rateurs binaires (ET / OU).
Pour utiliser un « ET », on écrira :
{ « $and »: [ { « champ » : « valeur » }, { « champ » : « valeur » } ] }
Le $and signifie que lâon va combiner plusieurs filtres de requĂȘte, que lâon renseigne dans une liste (dâoĂč la prĂ©sence des crochets [] ).
Exemple :
Pour utiliser un « OU », on écrira :
{ « $or »: [ { « champ » : « valeur » }, { « champ » : « valeur » } ] }
Le fonctionnement est le mĂȘme que pour le « ET ».
Exemple :
