Qu'est-ce que MongoDB?

MongoDB est une base de données documents avec un focus particulier sur la performance, l'évolutivité, la flexibilité et la vitesse.

  • Stockage Document-Oriented.
  • Support complet pour les indexes.
  • Système de réplication et de haute disponibilité avancé.
  • "Sharding" automatique.
  • Requêtes NoSQL basés sur l'optique du document.
  • Map/Reduce
  • Très hautes performances, généralement 2x à 3x plus rapide qu'un RDBMS.
  • Procédures stockées en JavaScript.

Comparaison avec un RDBMS standard

MongoDB n'est pas un RDBMS et ne tente en aucuns cas de l'être. Il y à donc des différences fondamentales importantes entre les deux :

  • Il n'existe aucuns liens d'intégrités (FOREIGN KEY).
  • Par conséquent, il n'y a pas d'équivalent à aucune forme de JOIN.
  • Les requêtes sont en NoSQL et, comme le nom le dit, pas en SQL.
  • Tout document doit absolument avoir un ID unique (clé primaire), si le champ est manquant à l'insertion, il sera ajouté automatiquement.
  • La plupart des éléments sont implicite, ils sont créés à la première utilisation.
  • Un système de sécurité et de contrôle d'accès par base de données existe mais il est désactivé par défaut et n'est généralement pas utilisé.
  • Les documents ne suivent pas de modèle prédéterminé.

Structure de MongoDB

En revanche, MongoDB organise les informations dans des documents sans format prédéfini.

  • Serveur
    • Databases
      • Collections
        • Documents
          • Key-value pairs

Quand utiliser MongoDB

MongoDB peux être utilisé dans tous les cas où un RDBMS serait utilisé car l'application qui utilise la base de données peut assumer les fonctions qui ne ont pas présentes.

Par contre MongoDB pourrait être un meilleur choix dans certain cas, principalement où :

  • Il faut stocker des données hétérogènes au même endroit.
  • L'application effectue un nombre immense d'écritures et de lectures par seconde.
  • Les données stocké sont énormes ou en quantité énorme.
  • Un temps de réponse excessivement bas est nécessaire.
  • Les données changent très fréquemment.
  • La concept map/reduce est utilisé.
  • Les indexes spéciaux constituent un avantage.

Cette liste n'est pas absolue, et même dans ces cas un RDBMS standard pourrait répondre au exigences. Tout dépends du volume planifié et de la structure des données.

Utilisation

Connexion à une base de données.

L'outil mongo

Il est possible d'utiliser MongoDB en ligne de commande avec l'outil mongo :

$ mongo
MongoDB shell version: 2.4.6
connecting to: test
>

Par défaut l'outil se connecte au serveur local et à la base de données test. Pour changer de base de données il suffit d'utiliser use.

> use demo
switching to db demo

Si la base de données en question n'existe pas, elle sera créée. Par la suite, la variable globale db référera à la base de données en cours.

En dehors de l'outil

Il existe un driver pour presque tous les langages de programmation (même pour LISP, Erlang et MatLab). Les drivers sont disponible sur le site de MongoDB.

Il existe aussi plusieurs ODM pour différents langages avec différents niveaux de fonctionnalités. Quelques exemples notables sont :

  • Node.js ­— Mongoose
  • PHP ­— Doctrine ODM
  • Java ­— MongoLink
  • Ruby ­— Mongoid

Documents

Conteneur de données stocké par MongoDB.

Documents

Mongo stock les documents au format BSON à l'interne mais le format JSON peut être utilisé pour communiquer.

Plusieurs drivers vont convertir les documents au format BSON avant de l'envoyer au serveur pour sauver du travail au serveur et aussi du temps de transfert.

Un document est composé de plusieurs paires clé-valeur ne suivant pas de modèle prédéterminé.

Un exemple de document simple :

{
  make:  "Mazda",
  model: "3",
  year:  2008
}

Documents (suite)

Considérant la nature du format BSON, il est possible de stocker un document avec une structure beaucoup plus complexe que l'exemple précédant.

Un exemple de document plus complexe :

{
  name: {
    first:   "William",
    last:    "Turner"
  },
  picture:   BinData(...),
  age:       19,
  birthday:  new Date('Aug 29, 1994'),
  cars: [
    {
      make:  "Mazda",
      model: "3",
      year:  2008
    }
  ],
  devices:   [ "Desktop", "Laptop", "Phone", "Tablet" ]
}
      

Collections

Contient, indexe et gère ses documents.

Le rôle de la collection

Une collection est similaire à une table dans la philosophie des RDBMS dans le sens ou c'est l'entité qui contient et applique certaines restriction aux donnés.

Dans MongoDB, une collection :

  • Contient des documents qui n'ont pas nécessairement la même structure.
  • Applique des restrictions sur certains champs.
  • Indexe les champs spécifié dans les indexes.
  • Sauvegarde, trouve, modifie et supprime (CRUD) ses documents.

Un point très important à retenir de MongoDB est qu'il est possible de sauvegarder des données hétérogènes dans une même collection. Il n'y a pas de concept de colonnes ou de structure de table comme dans un RDBMS.

Utiliser les collections

Comme une base de données, la création d'une collection est implicite, elle se fait à la première utilisation.

Pour accéder à une collection, il suffit d'y référer par son nom comme si elle était un membre de db, par exemple :

> db.people
demo.people

Il est aussi possible de lister les collections de la base de données courante.

> show collections
people
system.indexes

Opérations CRUD — Create

On peux créer ou, dans le langage SQL, insérer un document dans une collection avec la méthode insert() de la collection.

> db.people.insert({
  name: {
    first: "William", last: "Turner"
  },
  ...
})

Opérations CRUD — Read

La recherche ou, en SQL, le SELECT se fait par la méthode find() de la collection. Tous les documents sont retournés si aucun paramètre n'est spécifié.

> db.people.find({ "name.first": "William" })
{
  "_id" : ObjectId("528b0a15d45d79118196c284"),
  "name" : {
    "first" : "William",
    "last" : "Turner"
  },
  "age" : 19,
  "birthday" : ISODate("1994-08-29T04:00:00Z"),
  ...
}

Opérations CRUD — Update

Il existe deux méthodes pour modifier un document, la première est par update() qui supporte plusieurs opérateurs spéciaux.

> db.people.update(
  { "name.first": "William" },
  { $inc: { age: 1 }, $set: { birthday: new Date('Aug 29, 1993') } }
)

La deuxième méthode est d'utiliser save() qui est disponible autant sur le document que sur la collection. Par contre, cette méthode va insérer ou remplacer le document.

> var doc = db.people.find({ "name.first": "William" })
> doc.age++
> doc.birthday = new Date('Aug 29, 1993')
> doc.save()
> db.people.save(doc)

Opérations CRUD — Delete

Pour supprimer un document il suffit d'utiliser la méthode remove() de la collection avec une requête pour identifier le document.

> db.people.remove({ "name.first": "William" })

Indexes

En plus des indexes de bases supportés par un RDBMS, pour accommoder les documents MongoDB supporte d'autres types d'indexes :

  • Simple
  • Composé
  • Avec clés multiples (pour les listes)
  • Géospatiale (repères dans l'espace)
  • Textuelle
  • Hashed

Les indexes supportent aussi des modificateurs spéciaux :

  • TTL — Supprime le document après une période de temps donnée
  • Unique — La valeur des champs de l'indexe doit être unique
  • Sparse — Indexe seulement les documents contenant une valeur pour tous les champs de l'indexe

Tous les indexes peuvent être ajouté sur une collection en utilisant la méthode ensureIndex.

<Merci!>

Informations de contact: