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 :