Les contenus du cours BRE03 Web Dev Course © 2024 par Mari Doucet sont sous licence CC BY-NC-SA 4.0. Les données d’exemples et exercices sur MongoDB ne font pas partie de la licence et sont couverts par une licence CC-BY-NC-ND pour la 3WA.
MongoDB est une base de données qui n’utilise pas le SQL, donc pas de système table / colonne. Elle stocke des documents, et n’utilise pas de structure ou de schéma de la base. Elle est particulièrement utile quand la structure des données est amenée à changer.
Les données dans MongoDb ressemblent à du JSON. Voici une collection students
qui contient deux étudiants :
{
"students": [
{
"_id": 1,
"name": "Alan",
"notes": [14, 17, 19, 20],
},
{
"_id": 2,
"name": "Alice",
"notes": [19, 11, 20],
}
]
}
Sur vos IDE de la 3WA, MongoDB est déjà installé, vous allez donc utiliser mongosh dans votre terminal pour manipuler votre base de données.
mongosh "mongodb://username@mongodb.3wa.io:27017"
en remplacant username
par votre username PhpMyAdmin, il vous demandera ensuite un password c’est également celui de votre PhpMyAdmin.
use username
🔵 Vous n’avez besoin de faire l’import qu’une seule fois. Ensuite les données seront présentes et vous pourrez les manipuler.
Vous trouverez un fichier restaurants.json
sur Discord, et ici, il contient les données de base pour les exercices. Sur votre IDE, créez un dossier mongo
et mettez-y le fichier restaurants.json
. Ouvrez ensuite un terminal dans ce dossier et faites la commande suivante :
mongoimport --db=username --collection=restaurants --drop --file=restaurants.json --host=mongodb.3wa.io --port=27017 --username=username --password=password --authenticationDatabase=admin
en remplacant username
et password
par vos infos.
Les exemples suivants utilisent la collection restaurants
que nous venons d’importer.
db.restaurants.find({}); // tous les restaurants
db.restaurants.find({borough : "Brooklyn"}); // tous les restaurants du quartier Brooklyn
db.collection.find(filtre, sélection);
donc
db.restaurants.find({borough : "Brooklyn"}, {_id: 0, name : 1});
Nous donnera le nom (et seulement le nom) de tous les restaurants du quartier Brooklyn.
🔵 L’id est par défaut toujours présent, pour ne pas l’avoir il faut préciser _id : 0
.
Si je voulais chercher dans une liste de quartiers je pourrais écrire :
db.restaurants.find({borough : { $in : ["Brooklyn", "Bronx"] }}, {_id: 0, name : 1});
db.restaurants.find({borough : "Brooklyn", cuisine : "Burgers"}); // tous les restaurants de burgers de Brooklyn
est equivalent à
db.restaurants.find({ $and : [{ borough : "Brooklyn"}, {cuisine : "Burgers"}]}); // tous les restaurants de burgers de Brooklyn
db.restaurants.find({ $or : [{ borough : "Brooklyn"}, {borough : "Bronx"}]}); // tous les restaurants de Brooklyn ou du Bronx
À votre avis, que fait la requête suivante (sans l’exécuter) :
db.restaurants.find(
{
borough: "Brooklyn",
$or: [
{ name: /^B/ },
{ name: /^W/ }
],
},
{ name: 1, borough: 1 }
);
db.restaurants.insertOne({
_id: ObjectId(99999),
name: "My French Bistrot",
borough : "Brooklyn",
});
db.restaurants.insertMany([
{
_id: ObjectId(99998),
name: "My Little Bakery",
borough : "Queens",
},
{
_id: ObjectId(99999),
name: "My French Bistrot",
borough : "Brooklyn",
}
]);
Vous trouverez les 3 exercices dans le fichier exercices-find-insert.md
sur Discord et ici.
$gt, $gte
$lt, $lte
$ne
$exists
$size
Vous pouvez utiliser les RegEx dans vos requêtes find()
.
Je veux les restaurants qui ont au moins 56 places :
db.restaurants.find({seats : {$gte : 56}})
Je veux tous les restaurants sauf ceux de Brooklyn :
db.restaurants.find({borough : {$ne : "Brooklyn" })
Je veux les restaurants qui ne sont pas dans le Queens ou le Bronx :
db.restaurants.find({borough : {$nin : ["Queens", "Bronx"]}})
Je veux les restaurants qui n’ont pas de notes :
db.restaurants.find({grades : {$exists : false}})
…
Vous trouverez les exercices dans le fichier exercices-requetes.md
sur Discord et ici.