Chapitre II : Les bases de
données NoSQL :
MongoDB
Mongo DB
❑ Système de gestion de base de données NoSQL
❑ Orienté documents
❑ Crée en 2007
❑ Open-source developpé en C++
❑ Disponibilité de plusieurs fonctionnalités SQL (COUNT, GROUP BY, ORDER BY,
SUM...)
❑ Possibilité d’accèder aux données via une console JavaScript
❑ Données stockées sous format JSON (JavaScript Object Notation)
2
Rappel sur JSON
JSON c’est quoi?
JSON : JavaScript Object Notation
Format de représentation textuelle des données dérivé de la notation des objets du
langage JavaScript.
Permet de représenter de l'information structurée comme le permet XML par exemple.
3
JSon : Structures
❑ CLE + VALEUR
▪ “nom” : “Ali”
❑ Objet : collection de paires “clés/valeurs”
▪ Encapsulé dans des accolades
{ “nom” : “Touzani”,
“prenom” : “Narjess”,
“genre” : 1}
❑ Liste ordonnée de valeurs
▪ “liste” : [“SQL”, “XML”, “NoSQL”, “BDA”, “RI”]
4
Terminologie de MongoDB
Vue d’ensemble sur les principaux concepts (communs à plusieurs systèmes NoSQL).
5
Présentation de MongoDB
Documents
▪ Unités de base dans une base MongoDB.
▪ Equivalents aux objets JSON et sont comparables aux enregistrements
d'une table dans une base de données relationnelle.
▪ Tout document appartient à une collection et a un champ appelé _id qui
identifie le document dans la base de données.
▪ Enregistrés sur le disque sous un format BSON (JSON binaire).
6
Présentation de MongoDB
Collection
▪ Ensemble de documents, l'équivalent d'une table en relationnel.
▪ Les champs des documents d'une collection peuvent être différents d'un
document à un autre. Le seul champ commun et obligatoire est le champ
"_id".
7
Les types sous MongoDB
Number
Boolean
String
Array
Object
Null
Pour les dates, on utilise la classe Date de Javascript. {‘’ a ’’ : new Date()}
8
Gestion d’une BD: Création &
consultation
Création:
Pour se placer dans une base :
> use <nombase>
Remarque : si la base de données n’existe pas, elle sera créée
Par défaut
▪ Il existe trois bases de données admin, config et local
▪ si on ne se connecte pas à une base de données, on travaille dans une base de données appelée test
Consultation:
Afficher la liste des bases de données:
> show dbs
9
Gestion d’une BD: Suppression
Suppression de la base de données courante
◦ [Link]()
10
Gestion des collections :
création/suppression/Consultation
Création : Deux solutions :
❑ Directement :
◦ [Link](’adresse’)
❑ En insérant un document :
◦ [Link] ({nom: "Wick", prenom: "john"})
Suppression
[Link]()
Consultation
show collections
11
Gestion des documents: insertion
Chaque document possède un _id attribué par l’utilisateur ou par MongoDB (ObjectId).
Le champ _id constitue l’index de la collection.
Ajout d’un document
Deux syntaxes :
1) [Link]({clé1: ’val1’, clé2: ’val2’ ... }) ou bien
2) obj=({clé1 :’val1’, clé2: ’val2’ ... })
[Link](obj)
(save ajoute l’élément s’il n’existe pas, sinon elle le modifie en écrasant le contenu
précédent)
12
Exemples
1) Exemple avec insert 3) Exemple en définissant l’objet avant
[Link]( objet =
{ { nom: ’dalton’,
nom: ’wick’, prenom: ’jack’,
prenom: ’john’,
age: 45, niveau: ’master’
sportif: true }
} [Link](objet)
) 4) Exemple avec identifiant personnalisé
2) Exemple avec save
[Link] ( [Link](
{ { _id: 10,
nom: ’wick’, nom: ’dalton’,
prenom: ’john’, prenom: ’jack’,
age: 45, niveau: ’master’
sportif: true }
}
)
)
13
4) Exemple avec identifiant personnalisé
[Link](
{ _id: 10,
nom: ’dalton’,
prenom: ’jack’,
niveau: ’master’
}
)
14
Gestion des documents: insertion
save vs insert
❑save et insert permettent l’insertion et l’insertion multiple.
❑save ajoute ou modifie un document. insert ajoute seulement de nouveaux
documents.
❑save effectue une modification si l’_id spécifié existe dans la collection. insert
génère une erreur si l’_id spécifié existe dans la collection.
15
Gestion des documents: insertions
multiples
Insertions multiples :
[Link]( [ {clé1 : ’val1’, clé2 : ’val2’ ... },
{cléN : ’valN’, cléM : ’valM’ ... } ] )
Afficher le contenu d’une collection:
[Link]()
[Link]().pretty() : affichage au format JSON
Afficher le contenu d’une collection selon un critère :
[Link] ( {clé : ‘’valeur’’ } )
16
Soit la base « Restaurant », et soit un document de cette collection :
[Link]()
{
"_id" : ObjectId("594b9172c96c61e672dcd689"),
"restaurant_id" : "30075445",
"name" : "Morris Park Bake Shop",
"borough" : "Bronx",
"cuisine" : "Bakery",
"address" : {
"building" : "1007",
"coord" :{"type":"Point","coordinates":[-73.856077,40.848447]},
"street" : "Morris Park Ave",
"zipcode" : "10462"
},
"grades" : [
{"date" : ISODate("2014-03-03T[Link].000Z"),"grade" : "A","score" : 2},
{"date" : ISODate("2013-09-11T[Link].000Z"),"grade" : "A","score" : 6},
{"date" : ISODate("2013-01-24T[Link].000Z"),"grade" : "A","score" : 10},
{"date" : ISODate("2011-11-23T[Link].000Z"),"grade" : "A","score" : 9},
{"date" : ISODate("2011-03-10T[Link].000Z"),"grade" : "B","score" : 14}
]
}
17
Filtrer les données
▪Afficher les restaurants du quartier « Brooklyn »
[Link]( { "borough" : "Brooklyn" } )
▪Afficher seulement le premier document
db. [Link]( )
▪Et pour les compter :
[Link]( ).count()
[Link]( { "borough" : "Brooklyn" } ).count()
▪Combiner plusieurs critères de restriction: Afficher les restaurants du quartier « Brooklyn » et qui font
de la cuisine italienne:
[Link] (
{ "borough" : "Brooklyn",
"cuisine" : "Italian" }
)
18
Filtrer les données
▪ Filtrer une clé imbriquée:
[Link](
{ "borough" : "Brooklyn",
"cuisine" : "Italian",
"[Link]" : "5 Avenue" }
)
▪ Trier le résultat de recherche dans l’ordre croissant
db. [Link]( ).sort({borough : 1})
▪ Trier le résultat de recherche dans l’ordre décroissant
db. [Link]( ).sort({nom: -1})
19
Projeter les données
▪ Afficher quelques champs
db. [Link] ( { } , {borough :1} )
→ Affiche le nom de tous les restaurants ainsi que leurs
identifiants (qui sera affiché automatiquement)
▪ Pour ne pas afficher les id
db. [Link]( { } , {borough :1, _id: 0 } )
20
Affichage : les expressions régulières?
▪ Chercher les restaurants dont le nom commence par s :
db. [Link]( { name : /^s/ } )
Explication
- les deux / pour indiquer le début et la fin de l’expression régulière
- ^ pour indiquer par quoi commence le mot cherché
21
Affichage : les expressions régulières?
Chercher les restaurants dont le nom se termine par k :
[Link]( { name : /k$/ } )
Chercher les restaurants dont le nom commence par e ou par h :
db. [Link]({name : /^[eh]/ } )
Chercher les restaurants dont le nom commence par une lettre
comprise entre e et w :
db. [Link]({name : /^[e-w]/ } )
22
Autres opérateurs
Opérateur Signification
x? Indique que la lettre x est facultative. Elle peut y être 0 ou 1 fois.
X+ Indique que la lettre x est obligatoire. Elle peut y être 1 ou plusieurs fois.
x* Indique que la lettre x est facultative. Elle peut y être 0, 1 ou plusieurs
fois.
x{2,4} Indique que la lettre x doit se répéter au moins deux fois et au plus 4 fois.
. Un caractère quelconque
| Le ou logique
23
Filtrage avec des opérations
$gt : greater than (supérieur à)
$gte : greater than or equal (supérieur ou égal)
$lt : less than (inférieur à)
$lte : less than or equal (inférieur ou égal)
$eq : equal ( égal à)
$ne : not equal (différent de )
$in : dans (un tableau...)
$nin : not in (pas dans)
24
Exemple : $lt
[Link](
{"borough":"Manhattan",
"[Link]":{ $lt:10, $not:{$gte:10} } },
{"name":1,"[Link]":1, "_id":0}
)
Résultat
{ "name" : "1 East 66Th Street Kitchen",
"grades" : [
{"score" : 3},
{"score" : 4},
{"score" : 6},
{"score" : 0} ]
} 25
L’opérateur : $elemMatch
Chercher les restaurants qui ont un grade ‘C’ avec un score
inférieur à 40.
[Link](
{
"[Link]" : "C",
"[Link]" : {$lt : 40}
},
{"[Link]":1, "[Link]":1}
);
Problème si on observe le résultat !!
26
Exemple 2 : Résultat
{
"_id" : ObjectId("594b9172c96c61e672dcd695"),
"grades" : [
{"grade" : "B","score" : 21},
{"grade" : "A","score" : 7},
{"grade" : "C","score" : 56}, Pas OK
{"grade" : "B","score" : 27},
{"grade" : "B","score" : 27} ]
}
{ "_id" : ObjectId("594b9172c96c61e672dcd6bc"),
"grades" : [
{"grade" : "A","score" : 9},
{"grade" : "A","score" : 10},
{"grade" : "A","score" : 9},
{"grade" : "C","score" : 32} ] OK
}
27
Exemple 2
▪ Il faut préciser qu’il fallait que ce soit vérifié sur chaque élément
▪ La vérification se fait sur l’intérieur de la liste, pas sur chaque
élément de la liste.
▪ $elemMatch : l’opérateur permet de faire une vérification
instance par instance
[Link](
{ "grades" :
{ $elemMatch :
{ "grade" : "C", "score" : {$lt :40} } } },
{"[Link]" : 1,"[Link]" : 1}
);
28
Exemple 2 : Résultat
[Link]({
"grades" : {
$elemMatch : {
"grade" : "C",
"score" : {$lt :40}
}
}
},
{"[Link]" : 1,"[Link]" : 1}
);
{
"_id" : ObjectId("594b9172c96c61e672dcd6bc"),
"grades" : [
{"grade" : "A","score" : 9},
{"grade" : "A","score" : 10},
{"grade" : "A","score" : 9},
{"grade" : "C","score" : 32}
]
} 29
Affichage : Distinct
Afficher les différents quartiers de New York
[Link]("borough")
Résultat
[ "Bronx",
"Brooklyn",
"Manhattan",
"Queens",
"Staten Island",
"Missing"
]
30
Opérateurs logiques
$and : et
$or : ou
$not : le non logique
$nor : ou exclusif
31
Opérateurs de comparaison
{"_id" : 1, "nom" : "wick", "notes": [10, 15, 12], "age" : 19 }
{"_id" : 2, "nom" : "bob", "notes": [18, 8, 12], "age" : 35 }
{"_id" : 3, "nom" : "wolf", "notes": [7, 6, 13], "age" : 25 }
{"_id" : 4, "nom" : "green", "notes": [18, 16, 9], "age" : 22 }
Les étudiants âgés de plus de 30 ans
[Link]({"age":{$gt:30}})
Les étudiants dont l’âge est entre 20 et 30 ans
[Link](
{ $and : [ { age: { $gte:20 }},
{ age: { $lte:30 }} ] }
)
32
Gestion des documents: Modification
Pour modifier, on peut utiliser un des opérateurs suivants :
▪ $set : pour modifier la valeur d’un champ
▪ $unset : pour supprimer un champ
▪ $inc : pour incrémenter la valeur d’un champ
▪ $mul : pour multiplier l’ancienne valeur d’un champ par la valeur
spécifiée
▪ $rename : pour renommer un champ
▪ $min : pour modifier la valeur d’un champ si elle est supérieure à la
valeur spécifiée par min (et inversement pour max) ..
33
Exemple : $set
> [Link] ({"nom": "Salah"},
{$set: {ville: " Sousse"}} )
RQ: On peut aussi utiliser le save()
Explication
▪ Sélectionne les documents dont le champ nom est égal à Salah.
▪ Pour ce document, la valeur Sousse sera affectée pour le champ ville s’il existe.
▪ Sinon, le champ ville sera créé avec la valeur Sousse.
34 34
Exemple : $unset
Soit le document suivant:
{{ _id: 1, nom: “Ali", salaire : 400},
{ _id: 16, nom: “Salah", salaire : 250} }
> [Link] ( {nom: "Ali "},
{$unset: {salaire: " "}} )
Explication
Supprime la colonne « salaire » pour le document dont le nom est « Ali »
Résultat
{{ _id: 1, nom: “Ali"},
{ _id: 16, nom: “Salah", salaire : 250} }
35 35
Exemple : $inc
Soit le document suivant:
{
_id: 1,
libelle: "abc123",
quantité: 10,
dimensions: {
longueur: 2,
largeur: 3.5
}
}
> [Link]({ libelle: "abc123" },
{ $inc: { quantité: -2, " [Link]": 1 } } )
Explication
▪ Décrémente la valeur de « quantité » de 2 et incrémente la longueur de 1
▪ Sinon, les champs quantité et longueur n’existent pas, ils seront créés avec les valeurs respectives -2 et 1.
36 36
Exemple : $mul
Soit le document suivant:
{ "_id" : 1, libelle : "ABC", "prix" : 10, "quantite" : 25 }
> [Link]({ _id:1 },
{ $mul: { prix: 1.25, quantite:2 } } )
Explication
• La nouvelle valeur de prix est égale à (10 * 1,25)
• La nouvelle valeur de quantité est égale à (25 * 2)
Résultat
{ "_id" : 1, “libelle" : "ABC", "prix" : 12.5, "quantite" : 50 }
Remarque
Si le champ à modifier n’existe pas dans le document, il sera ajouté et mis à 0. 37 37
Exemple : $min
Soit le document suivant:
> { _id: 1 , highScore : 800 , lowScore: 200 }
> [Link] ( { _id: 1 }, { $min: { lowScore: 150 } } )
compare la valeur actuelle de lowScore (200) à la valeur spécifiée (150) et
modifie la valeur de lowScore à 150 puisque 150 est inférieure à 200.
Résultat
> { _id: 1, highScore: 800, lowScore: 150 }
38 38
Modification : remove ( )
[Link]( { nom : ‘’Ali’’ } )
Explication
Suppression des documents dont le nom est « Ali »
Explication
Il est possible d’utiliser aussi :
▪ deleteOne()
▪ deleteMany()
39
[Link]({ "_id" : 6040, "name" : "Barry Erin", "gender" : "M", "age" :
32, "occupation" : "doctor/health care",
"movies" : [ { "movieid" : 573, "rating" : 4, "timestamp" : 956704056 }, {
"movieid" : 589, "rating" : 4, "timestamp" : 956704996 }, { "movieid" : 1, "rating"
: 3, "timestamp" : 957717358 }, { "movieid" : 2068, "rating" : 4, "timestamp" :
997453982 }})
[Link]({ "_id" : 1, "title" : "Toy Story (1995)","duration":140,
"genre" : "Children's" })
1- Afficher la liste des collections de la base de données DBMovie
2- Afficher les titres des films de genre « Drama»
3- Afficher les différents genres de films dans la base de données.
4- Combien y a-t-il de films dans la base de données ?
5-Quelle est l’occupation de Davis Everette ? Ecrivez une requête dont la réponse affiche uniquement son
nom et son occupation.
40