Les requĂȘtes Mongo DB

Sur cette page tu trouveras :

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.
Faire une requĂȘte sur sa base de donnĂ©es, c’est donc exĂ©cuter l’une de ces opĂ©rations ! On peut traduire requĂȘte par « demande », faire une requĂȘte c’est faire une demande Ă  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.


  db_utilisateurs.insert_one({
 « nom » : « Lucas »,         # Nom de l’utilisateur
 « mdp » : « UnSuperMotDePasse »,# Mdp de l’utilisateur
 « age » : 32               # Age de l’utilisateur
  })

À 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 !

# RĂ©cupĂšre tous les utilisateurs dont l’age est de 18
  utilisateurs = db_utilisateurs.find({« age » : 18})

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 :

on récupÚre la case dont la positionX est de 7 ET dont la positionY est de 3

Pour utiliser un « OU », on écrira :

{ « $or »: [ { « champ » : « valeur » }, { « champ » : « valeur » } ] }

Le fonctionnement est le mĂȘme que pour le « ET ».

Exemple :

on rĂ©cupĂšre les utilisateurs dont le nom est Lucas OU dont l’Ăąge est de 18
Retour en haut