- Introduction à MongoDB
- JSON
- NoSQL
- Opérations usuelles
BD NoSQL distribué de type Document Store (site web)
Objectifs :
Principe de base : les données sont des documents
collections
JSON
JavaScript Object Notation
(JSON
suite)
{}
{ "nom": "jollois", "prenom": "fx" }
[]
[ 1, 5, 10]
string
et number
) et trois constantes (true
, false
, null
)Validation possible du JSON sur jsonlint.com/
{ "tubd": { "formation": "DU Analyste Big Data", "responsable": { "nom": "Poggi", "prenom": "JM" }, "etudiants" : [ { "id": 1, "nom": "jollois", "prenom": "fx" }, { "id": 2, "nom": "aristote", "details": "délégué" }, { "id": 5, "nom": "platon" } ], "ouverte": true }, "tudv": { "formation": "DU Data Visualisation", "ouverte": false, "todo": [ "Creation de la maquette", "Validation par le conseil" ], "responsable": { "nom": "Métivier" } } }
BSON
: extension de JSON
Schéma dynamique
ALTER TABLE
ou de redesign de la basePas de jointures entre les collections
Commandes suivantes réalisables à partir du shell
Existence d’une librairie R : rmongodb
La commande db.collection.find()
, dans laquelle collection
désigne la collection sur laquelle on travaille, permet de retourner tous les documents.
La commande db.collection.findOne()
retourne un élément (le premier a priori).
Pour faire une restriction, on doit passer un critère (ou un ensemble de critère) en paramètre :
db.collection.find({ attribut: valeur });
Les critères sont au format JSON
Toujours avec la commande db.collection.find()
, il est possible de ne choisir que certains éléments à afficher. Pour cela, on doit passer en deuxième paramètre un littéral JSON
avec pour chaque élément
attribut: 1
, il sera présent (inclusion)attribut: 0
, il sera absent (exclusion)_id
toujours présent, sauf si explicitement exclu (avec _id: 0
)Si on veut une projection sans restriction :
db.collection.find({ }, { attribut1: 1, attribut2: 1 });
Pour compter le nombre de documents :
db.collection.find().count();
Pour n’avoir que les \(n\) premiers documents :
db.collection.find().limit(10);
Pour trier les documents, fonction sort()
, qui prend en paramètre un littéral décrivant quels attributs on utilise et comment :
attribut: 1
: tri croissantattribut: -1
: tri décroissantdb.collection.find().sort({ attribut: 1 });
Il existe la fonction db.collection.aggregate( tableau )
qui permet le calcul d’agrégat. Le tableau peut contenir les éléments suivants (dans des littéraux) :
$project
: redéfinition des documents (si nécessaire)$match
: restriction sur les documents à utiliser$group
: regroupements et calculs à effectuer$sort
: tri sur les agrégatsdb.collection.aggregate([ { $group: { _id: "$attributQl", total: { $sum: "$attributQt" } } } ])
Il n’existe pas de processus de jointures dans MongoDB (ce n’est pas l’idée).
Pour cela, on doit utiliser des curseurs (ou cursor
) en stockant le résulat d’un find()
dans une variable, on créé un cursor
. Celui-ci a des fonctions permettant de naviguer dans ce résultat (pour faire les jointures)
cursor.hasNext()
: pour savoir s’il reste des documents dedanscursor.next()
: document suivant dans le curseurcursor.objsLeftInBatch()
: pour savoir combien de document il reste dans le curseurLe paradigme Map-Reduce permet de décomposer une tâche en deux étapes :
Exemple classique : décompte des mots présents dans un ensemble de texte
<mot, 1>
(un document = beaucoup de résultats générés)On utilise la fonction db.collection.mapReduce()
pour appliquer l’algo Map-Reduce sur les documents de la collection, avec les paramètres suivants :
map
: fonction JavaScript
emit(key, value)
pour créer un couple résultatreduce
: fonction JavaScript
key
et values
(tableau des valeurs créés à l’étape précédente)return result
pour renvoyer le résultatout
: collection dans laquelle stocker les résultats