Benoit Luttringer
Stockage de documents
Hautes performances
Haute disponibilité
Haute capacité
MongoDB n'offre pas certaines fonctionnalités, contrairement aux bases relationnelles classiques
Les jointures
Adapter le modèle
Les transactions
Mais opérations atomiques sur un seul document
MongoDB peut être installée sans difficulté particulière sur Linux, OSX, Windows.
MongoDB est opensource mais il existe une version Enterprise qui apporte en plus:
Un enregistrement MongoDB est un document qui est lui même une structure de données composée de clés / valeurs (format similaire au JSON)
Les valeurs de champs peuvent inclure d'autres documents, des tableaux et des tableaux de documents.
Un ensemble de documents est appelé une collection (l'équivalent d'une table en relationnel)
{
"title": "Electric Ladyland",
"release_year": "1968",
"genres": ["blues rock", "acid rock", "psychedelic rock"],
"musicians": [{
"name": "Jimi Hendrix",
"roles": ["lead singer", "guitarist"]
}, {
"name": "Mitch Mitchell",
"roles": ["drums", "percussions"]
}, {
"name": "Noel Redding",
"roles": ["bass guitar", "singer"]
}],
"tracks_list": ...
}
Tous les types classiques (Numérique, chaînes de caractères, dates, timestamps, etc.)
GridFS pour stocker des fichiers de grande taille, GeoJSON pour les données géospatiales
Le shell mongo permet de se connecter à une base MongoDB et d'interagir avec la base et les données qu'elle contient
prompt> mongo <hostname>/<database>
pour se connecter à la base indiquée
Insérer un document dans une collection (qui sera créée si elle n'existe pas)
db.albums.insert(
{
"title": "Led Zeppelin II",
"release_year": "1969",
"genres": ["blues rock", "hard rock"]
}
)
Utiliser la méthode find() pour générer une requête sur une collection
db.albums.find()
Renvoie la liste de tous les albums de la collection
Mettre à jour des données avec la méthode update()
db.albums.update(
{"title": "Led Zeppelin II"},
{
$push: { "genres": "blues"}
}
)
Ajoute un genre à la liste des genres de l'album "Led Zeppelin II"
Supprimer des documents dans une collection avec la méthode remove()
db.albums.remove(
{
"genres": { $in: ["rockabilly"] }
}
)
Supprime tous les albums dont un des genres déclarés est 'rockabilly'
On peut également avec MongoDB shell
Il existe un grand nombre de drivers disponibles pour interagir avec MongoDB depuis une application
Une requête se fait via la méthode find()
db.albums.find(
{ "release_year": { $gt: 1960 } },
{ title: 1}
).limit(10)
Elle s'applique sur une collection, en précisant les critères de recherche, les champs à sélectionner ainsi qu'un modificateur de curseur. Chacun de ces éléments est optionnel.
Le comportement des requêtes est le suivant
L'appel à la méthode find() exécute une requête sur le serveur et retourne un curseur permettant d'itérer sur les résultats.
Les index permettent d'optimiser les requêtes en évitant à MongoDB de faire des collection scan et en réduisant ainsi le nombre de documents analysés
Plusieurs types d'index sont disponibles:
MongoDB possède un optimisateur de plan de requêtes qui choisit le plan le plus efficace pour une requête donné en fonction des index disponibles. Le meilleur plan est alors sauvegardé.
Le plan est révisé lorsque
MongoDB permet à plusieurs clients d'interagir avec les données, elle utilise donc des mécanismes particuliers permettant de s'assurer qu'une même donnée n'est pas modifié par plusieurs clients simultanément.
Lock partagé pour les lectures, au niveau collection (pour le moteur MMAPv1)
Lock exclusif pour les écritures, au niveau collection (pour lemoteur MMAPv1)
Les locks sont de multiple granularité: global, base, collection
Certaines opérations, comme les lectures / écritures d'une collection lockent la collection mais certaines autres peuvent également locker la base ou bien l'instance complète
Redondance
Eviter la perte de données
Disponibilité
Prévenir les pannes
Mais également
Augmenter la capacité de lecture, localiser les données dans plusieurs datacenter, rapprocher les données des utilisateurs
Groupe de réplicats = ensemble de process mongod gérant le même ensemble de données
un primaire, des secondaires
Si le noeud primaire tombe, un noeud secondaire est automatiquemnt promu
Par défaut, les clients lisent les données sur le noeud primaire
Il est possible de lire sur les noeuds secondaires, mais - asynchronisme oblige - la fraîcheur des données n'est pas forcément optimale
But = augmenter la capacité de la base en distribuant les données
Scaling horizontal
Clé de partitionnement = un champ (ou un groupe de champ) indexé
Le partitionnement est fait automatiquement
Egalement lors de l'ajout / suppression d'un shard à chaud
Le modèle conçu est piloté par les besoins de l'application
Pas forcément adapté à une autre
Avec un SGBDR, on capte l'essence des données, on modélise un domaine
Avec MongoDB, on cherche le meilleur moyen d'organiser nos données pour répondre au mieux aux besoins applicatifs
Dans certaines limites
Gestion d'objets relativement simples (documents, factures, articles, géospatial)
Pas de liens complexes entre plusieurs objets, domaine de prédilection des SGBDR
Un "bonus"