Aller au contenu

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.

  1. Télécharger restaurants.json et décompresser son contenu.
  2. Créer une base de données "emplacements".
  3. Créer une collection "restaurants".
  4. Sélectionner la collection "restaurants" et cliquer sur le bouton "Add data" puis Import file.
  5. Sélectionner le fichier restaurants.json et importer.

Avec mongoimport

  1. Télécharger restaurants.json et décompresser son contenu.
  2. Copier le fichier restaurants.json vers le container : docker cp restaurants.json mongodb:/
  3. Se connecter au container : docker exec -it mongodb bash
  4. Lancer mongosh et créer : a. Une base de données "emplacements". a. Une collection "restaurants".
  5. 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%';