Pour utiliser ta base de données, tu devras faire des requêtes. Les opérations les plus courantes sont :
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 »).
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({ |
À 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()
Il existe de multiples manières de récupérer les données selon ce que l’on veut faire. En voici quelques-unes.
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 !
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 |
Un autre exemple où on récupère tous les utilisateurs dont l’âge est de 18
Cette fois on utilise la fonction find_one() en précisant la clef et la valeur de l’on veut chercher
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' }} )
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
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.
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 clef ‘_id’ qui est unique pour chaque donnée.
Quand on récupère la valeur de l’id, on peut avoir une chaine de caractère alors que le type de la valeur attendue est ObjectId. Pour transformer la chaine en ObjectId, il faut importer la librairie suivante :
Et utiliser la fonction ObjectId sur la chaine de caractères :
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 :