Opérations de base¶
Format des commandes MongoDB¶
Format des appels
//Appel d'opération sur la base en cours
> db.operation();
//Appel d'opération sur la collection
> db.collection.operation();
Manipulation des bases de données¶
Lister les bases¶
show
Voir les bases existantes
> show dbs
Pour voir la base sélectionnée
> db
Sélectionner ou créer une BD¶
C'est la base qui sera active et représente par le préfixe db. Toutes les opérations exécutées ensuite sont exécutées sur cette base.
use
> use nom_base
Example
Créer une base bibliotheque
> use bibliotheque
Supprimer la base de données en cours¶
dropDatabse
> db.dropDatabse();
Afficher la liste des opérations sur une BD
> db.help();
Les collections de la base en cours¶
Création de collection
> db.createCollection("nom")
Exemple
Créer une collection livres
> db.createCollection("livres");
Lister les collections
> show collections
Supprimer une collection
> db.nom_collection.drop();
Insertion de documents¶
Un document est inséré dans une collection. Il est possible d'utiliser les méthodes insert(), insertOne() ou insertMany().
Exemple
> db.livres.insert({
"Titre":"Mongodb: the definitive guide, 2nd edition",
"Catégorie":"Informatique",
"Pages":434,
"Année":2013,
"Prix":42.73,
"Résumé":"This updated second edition provides guidance for database developers,
advanced configuration for system administrators, and an overview of the concepts
and use cases for other people on your project.",
"Langue":"EN",
"ISBN":9781449344689,
"Editeur":{"Nom":"","Pays":""},
"Auteurs":[{"Nom":"Chodorow","Prénom":"Kristina"}],
"Mots clés":["MongoDB","NoSQL","Database"]
});
Exercice
Ajouter le livre ayant cette couverture :
Note
- MongoDB associe un identifiant unique à chaque document appelé _id, et lui attribue une valeur si elle n’est pas indiquée explicitement.
- MongoDB ne fait aucun contrôle de structure ou autres contraintes sur les données. Ces contrôles seront réalisées.
Importation de données¶
Avec Compass¶
Pour alimenter la base avec des données existantes dans un format supporté (JSON, CSV, TSV), utiliser Compass.
- Télécharger restaurants.json et décompresser son contenu.
- Créer une base de données "emplacements".
- Créer une collection "restaurants".
- Sélectionner la collection "restaurants" et cliquer sur le bouton "Add data" puis Import file.
- Sélectionner le fichier restaurants.json et importer.
Avec mongoimport¶
- Télécharger restaurants.json et décompresser son contenu.
- Copier le fichier restaurants.json vers le container :
docker cp restaurants.json mongodb:/
- Se connecter au container :
docker exec -it mongodb bash
- Lancer
mongosh
et créer : a. Une base de données "emplacements". a. Une collection "restaurants". - Quitter mongosh et importer le fichier restaurants.json avec la commande :
mongoimport -d emplacements -c restaurants /restaurants.json
Interrogation¶
C'est la méthode find() qui réalise l'interrogation dans MongoDB.
Les requêtes seront effectuées sur la base de données des restaurants importée précédemment : use emplacements
Format de la méthpde find()¶
find possède 2 paramètres optionnels représentés également en format JSON. Le premier représente la requête de filtrage (clause WHERE en SQL). Le second paramètre exprime l'opération la projection.
find
> db.collection.find(query, projection);
Projection¶
{clé:<0,1>}
0 : exclusion, 1 : inclusion
- L'identifiant _id est implicitement inclus dans le résultat. Pour l'exclure, ajouter _id:0.
- Il n'est pas possible de mélanger inclusions et exclusions sauf pour le champ _id.
- Pour accéder à un champ d'un document imbriqué, utiliser . : champ1.champ2.
Exemples
Afficher les noms des restaurants et leurs spécialités (cuisine).
> db.restaurants.find({},{name:1, cuisine:1});
SELECT name, cuisine FROM restaurants
Afficher tous les noms des restaurants et la rue (street) et pas le _id.
> db.restaurants.find({},{name:1, "address.street":1, _id:0});
SELECT name, street FROM restaurants
Contenu de collection¶
find() affiche le contenu de la collection tandis que count() retourne le nombre de documents de la collection.
Exemple
> db.restaurants.find()
> db.restaurants.count()
SELECT * FROM restaurants
SELECT count(*) FROM restaurants
Sélection¶
Par valeur exacte
La condition d'égalité est exprimée par champ:valeur
.
Exemples
Trouver les restaurants du quartier Brooklyn.
> db.restaurants.find( { "borough" : "Brooklyn" } );
SELECT * FROM restaurants WHERE borough = 'Brooklyn'
Trouver les restaurants du quartier Brooklyn offrant la cuisine italienne.
> db.restaurants.find( { "borough" : "Brooklyn", "cuisine":"Italian" } )
SQL SELECT * FROM restaurants WHERE borough = 'Brooklyn' and cuisine = 'Italian'
Trouver les restaurants sans nom (null).
> db.restaurants.find( { "name" : null } );
SELECT * FROM restaurants WHERE name IS NULL
Expressions régulières
Avec les champs de type texte, MongoDB accepte les expressions régulières sous le format "champ":/regex/options
.
Option | Description |
---|---|
i | insensible à la casse. |
m | Multiligne. |
Exemples
Trouver les restaurants dont le nom contient Pizza
sans prendre en compte la casse.
> db.restaurants.find( { "name" : /pizza/i});
SELECT * FROM restaurants WHERE upper(name) like '%PIZZA%'
Trouver les restaurants dont le nom commence par 'A'.
> db.restaurants.find( { "name" : /^A/});
SELECT * FROM restaurants WHERE name like 'A%'
Trouver les restaurants dont le nom est composé de 7 caractères.
> db.restaurants.find( { "name" : /^.{7}$/});
SELECT * FROM restaurants WHERE name like '_______'
Filtrage avec opérateurs¶
Pour construire les critères de sélection, plusieurs opérateurs peuvent être utilisés dans la requête selon le format : {champ1:{<opérateur>:<valeur1>, ...}
Les opérateurs
Opérateur | Rôle | Exemple |
---|---|---|
$gt, $gte | >,>= | "champ":{"$gt":10} |
$lt, $lte | <,<= | "champ":{"$lt":10} |
$ne | != | "champ":{"$ne":10} |
$in, $nin | IN, NOT IN | "champ":{"$in":[10,20,30]} |
$or | ou logique | "$or":[{"champ":{"$gt":10}},{"champ":{"$lt":5}}] |
$and | et logique | "$and":[{"champ":{"$gt":10}},{"champ":{"$lt":5}}] |
$not | négation | "champ":{"$not":{"$gt":10}} |
$exists | Existence de la clé dans le document | "champ":{"$exists":1} |
$size | taille d'une champ array | "champTableau":{"$size":5} |
$elemMatch | vérification conjointe de plusieurs conditions sur un élément du tableau | "champTableau":{$elemMatch:{"champInterne":{$gt:5}}} |
Exemples
Exemple 1
Trouver les noms et scores des restaurants de Manhattan ayant reçu au moins un score inférieur à 10.
> db.restaurants.find( {
borough:"Manhattan",
"grades.score":{"$lt":10}
},
{name:1,"grades.score":1, _id:0});
Exemple 2
Trouver les noms et scores des restaurants de Manhattan avec des scores tous inférieur à 10.
> db.restaurants.find( {
borough:"Manhattan",
"grades.score":{$not:{"$gte":10}}
},
{name:1,"grades.score":1, _id:0});
Exemple 3
Trouver les restaurants qui ont une évaluation ayant un grade ‘C’ avec un score inférieur à 40.
> db.restaurants.find({
"grades" :{
$elemMatch :{
"grade" : "C",
"score" : {$lt :40}
}
}
},
{"grades.grade":1,"grades.score":1, _id:0});
$elemMatch permet de vérifier les conditions sur le même élément du tableau. Sans cet opérateur on obtient des évaluations avec des scores différents de 30 ou des grades différents de C. Vérifier les résultats de la requête sans elemMatch :
> db.restaurants.find({
"grades.grade" : "C",
"grades.score" : {$lt : 30}
},
{"grades.grade":1, "grades.score":1});
Exemple 4
Trouver les restaurants qui ont une exactement 4 évaluations.
> db.restaurants.find({
"grades" :{$size:4}
});
Exemple 5
Trouver les restaurants qui ont une longitude (la première valeur de coordinates) < -100.
> db.restaurants.find({
"address.coord.coordinates.0" :{$lt:-100}
});
Distinct
Pour déterminer les valeurs distinctes d'un champ.
Exemples
Trouver les différents quartiers.
> db.restaurants.distinct("borough");
SELECT distinct borough FROM restaurants
Trouver l'intervalle des scores.
> db.restaurants.distinct("grades.score");
Mise à jour¶
Update
> db.collection.update(
{filtre},
{
<opérateurUpdate>:{<champ1>:<valeur1>,....},
<opérateurUpdate>:{<champ1>:<valeur1>,....},
....
},
{
"multi":true|false, //mise à jour de plusieurs documents - par défaut false
"upsert":true|false //insertion si aucun document ne correspond - par défaut false
}
);
Opérateurs de mise à jour
Opérateur | Description | Exemple |
---|---|---|
$currentDate | Affecter à un champ la date en cours | $currentDate:{"champ":true} |
$inc, $mul | Incrémenter resp. multiplier la valeur d'un champ par une valeur | $inc:{"champ":5} |
$min, $max | Modifie le champ si la nouvelle valeur est inférieure resp. supérieure à la valeur actuelle. | $min:{"champ":10} |
$rename | Renommer un champ. | $rename:{"champ":"nouveauChamp"} |
$set | Affecte une valeur au champ spécifié et l'ajoute s'il n'existe pas. | $set:{"champ":2} |
$unset | Supprime le champ du document. | $unset:{"champ":""} |
$pop | Supprime le premier ou dernier élément d'un champ tableau. | $pop:{"champTableau":-1} -1: premier, 1:dernier |
$pull | Supprime les éléments qui vérifient la condition. | $pull:{"champTableau":condition} |
$push | Ajoute un ou plusieurs éléments au tableau à une position. | $push:{"champTableau":{$each:[valeur1, valeur2,...], $position: positionInsertion}} |
Exemples
Exemple 1
Modifier le champ borough en 'Manhattan' et affecter la date actuelle au champ lastupdate du restaurant appelé "The Movable Feast".
> db.restaurants.update(
{"name":"The Movable Feast"},
{
$set:{"borough":"Manhattan"},
$currentDate:{"lastUpdated":true}
}
);
UPDATE restaurants
SET
borough = 'Manhattan',
lastUpdated = sysdate,
WHERE name = 'The Movable Feast'
Exemple 2
Supprimer le champ cuisine et ajouter 2 point au premier score du restaurant "The Movable Feast"
> db.restaurants.update(
{"name":"The Movable Feast"},
{
$unset:{"cuisine":""},
$inc:{"grades.0.score":2},
}
);
Exemple 3
Ajouter un commentaire avec la valeur acceptable pour les restaurants qui n'ont pas eu le grade 'C'.
> db.restaurants.update (
{"grades.grade" : {$not : {$eq : "C"}}},
{$set : {"comment" : "acceptable"}},
{"multi" : true}
);
Exercice
Donner la commande qui permet d'annuler celle de l'exemple 2.
Suppression¶
Remove
> db.collection.remove(
{filtre},
{justOne:true|false} //Optionnel par défaut false
);
Exemple
Supprimer tous les restaurants dont le nom commence par M.
> db.restaurants.remove({name:/^M.*/});
DELETE FROM restaurants WHERE name like 'M%';