I. Introduction▲
Le NoSQL fait partie des nouveaux types de Bases de données dont le fonctionnement est différent de celui des bases de données relationnelles que nous connaissons (SQLServer, MySQL, Oracle et bien d'autres ). Il existe plusieurs bases de données NoSQL telles que Cassandra(utilisée par Facebook), CoucheDB et bien entendu MongoDB. Ces systèmes de gestion des bases de données pour ne citer que ceux-là se distinguent en différents types. Nous avons ceux qui gèrent les bases de données orientées document, orientées colonnes et orientées graphe. En ce qui concerne MongoDB, il gère les bases de données orientées document.
II. Contexte d'utilisation de MongoDB▲
L'utilisation de MongoDB dépendra bien entendu du type d'application à développer et si possible des données à manipuler. Dans le cadre d'applications destinées aux établissements financiers et boursiers où les transactions sont couramment utilisées, MongoDB ne sera pas la solution adéquate. Par contre, s'il s'agit d'un réseau social ou tout autre type d'applications où il y aurait des envois massifs de données sans toutefois se soucier des contraintes d'intégrité, MongoDB sera beaucoup plus adapté. Comme bon nombre de solutions NoSQL, il implémente le MapReduce et GridFS (pour le stockage de fichiers volumineux). MongoDB est utilisé par de très grands noms tels Disney, MTV, Foursquare, Sourceforge et bien d'autres.
III. Téléchargement de MongoDB▲
Pour télécharger et installer MongoDB, vous devrez vous rendre ici ou utiliser cet article rédigé par lee1990.
IV. MongoDB : une base de données orientée document▲
Les données manipulées sont au format BSON(Binary JSON), se présentant sous la forme de documents eux-mêmes enregistrés dans des collections. De manière plus simple, on dira que la collection est ce que les adeptes du monde relationnel appelleront une table et les documents sont les enregistrements.
Voici comment se présente une collection.
{
"_id" : ObjectId("4efa8d2b7d284dad101e4bc7")
,
"nom" :"Jean",
"prenom" :"calvaire"
}
{
"_id" :ObjectId("4efa8d2b7d104dad250e4bc8")
,
"nom" :"Kouassi",
"prenom" :"dupont"
}
Sur chaque document, les éléments peuvent être ajoutés et modifiés selon nos besoins, sauf le champ _id qui est l'identifiant de ce document et en mode lecture seule.
En plus de cela, une collection peut avoir d'autres documents dont les structures différeront les unes des autres comme le montre l'exemple qui suit :
{
"_id" :ObjectId("4efa8d2b7d285bac101e4ac7"),
"nom" :"Pierrot",
"prenom" :"lelion",
"tel" :"995555",
"enfants":
[
"jean-jaques",
"alfred",
"alain",
"gustave",
"jesica"
]
}
{
"_id" :ObjectId("4efa8d8a8d285bac101e4ba7"),
"nom" :"Didier",
"prenom" :"Lefevre",
"tel" :"66666",
"adresse":"Rue du chemin"
}
V. Lancement du shell▲
Toute opération sur le serveur n'est possible que si ce dernier est démarré. Pour le lancer, rendez-vous dans votre dossier d'installation sous la console et entrez la commande mongo ci-dessous.
>mongo
Après avoir entré la commande mongo, nous accédons au shell de MongoDBcomme le montre l'image ci-après :
Par défaut, nous sommes connectés à une base de données nommée test. Cependant, nous avons également la possibilité de ne pas sélectionner de base de données. Pour cela, il faut utiliser la même commande avec l'argument --nodb.
>mongo --nodb
Ou encore, se connecter avec le nom la base de données à laquelle nous souhaitons accéder :
>mongo nom_de_la_base_de_donnees
VI. Créer ou accéder à une base de données▲
Pour créer une base de données avec MongoDB, nous devrons juste utiliser la commande suivante :
use le_nom_de_la_base_de_donnees
Nous allons créer notre base de données my_databasequi nous servira tout au long de ce tutoriel. Notez qu'avec la commande use, si la base de données existe, on y accède directement ; dans le cas contraire, elle sera créée avant qu'on y accède.
>use my_database
Une fois connectés à notre base de données, nous pourrons effectuer les opérations de base avec MongoDB.
VII. Opérations de base sur le shell▲
Nous verrons les opérations de base qui sont l'insertion, la modification, la sélection et la suppression.
VII-A. L'insertion▲
L'insertion sous MongoDB se fait en utilisant la méthode insert en fournissant en paramètres le document à insérer.
>db.le_nom_de_la_collection.insert({"cle1" :"valeur1","cle2" :"valeur2"})
>db.auteur.insert({"nom": "Lanna","prenom" :"Bauer","tel" :"0033125425896"})
Le mot-clé db désigne la base de données en cours d'utilisation, auteur désigne la collection sur laquelle porte l'insertion et pour terminer nous utilisons la méthode insert en précisant les informations à sauvegarder (le nom, le prénom et autres).
Nous venons d'insérer notre premier document. Nous avons également la possibilité de faire la même opération autrement. Il nous suffit de déclarer un objet JavaScript en assignant des valeurs à ses propriétés.
>var un_autre_auteur={}
>un_autre_auteur.nom="Kanga"
>un_autre_auteur.prenom="kouadio"
>un_autre_auteur.adresse="Adresse_Abidjan"
>un_autre_auteur.tel="00232015"
À la fin de l'assignation, il nous faudra insérer l'objet dans la collection comme le montre le code et l'image ci-dessous :
>db.auteur.insert(un_autre_auteur)
Le document a été inséré comme le montre l'image ci-dessus.
VII-B. La modification▲
Pour modifier un document, il nous faut dans un premier temps recueillir l'élément en question et ensuite effectuer la modification.
Nous recueillons l'élément avec la méthode findOne()qui s'utilise de la manière suivante :
>var auteur_update=db.auteur.findOne({"cle" :"valeur"})
On peut donc appliquer les modifications que nous voulons :
>var auteur_update=db.auteur.findOne({"nom" :"Kanga"})
>auteur_update.nom="f-leb"
>auteur_update.prenom="fabien"
>auteur.tel="00232015"
>auteur_update.articles=[{"Article 1" :"MongoDB:Initiation"},{"Article 2" :"Cassandra"}]
>auteur_update.titre="Modérateur et Correcteur"
>auteur_update.adresse="Aucune"
Pour terminer, il nous faut également sauvegarder le document avec la syntaxe suivante :
>db.auteur.save(auteur_update)
VII-C. La suppression▲
La suppression de documents avec MongoDBpeut s'effectuer de trois manières. La premièreavec la méthode remove, la deuxième avec deleteet la troisième avec drop.
VII-C-1. Avec remove▲
La méthode remove() s'utilise en précisant des paramètres de la manière suivante :
>db.collection.remove({"cle":"valeur"})
Supprimons par exemple un auteur dont le nom est Anonyme.
>db.collection.remove({"nom":"Anonyme"})
Cette méthode utilisée sans paramètre déclenche une erreur.
>db.auteur.remove()
VII-C-2. Avec delete▲
Avecdelete, la suppression concerne non seulement le document, mais aussi ses propriétés. Mais avant, il faut utiliser la méthode findOne() pour extraire le document concerné, ensuite procéder à la suppression et pour finir valider l'opération. À titre d'exemple, nous souhaitons supprimer l'auteur qui se nomme f-leb nous commencerons par l'extraire en fonction de ses paramètres.
>var monauteur=db.auteur.findOne({"nom":"f-leb"})
La variable monauteur contient les informations concernant f-leb. Nous pouvons donc avoir plus de détails en saisissant juste le nom de la variable.
On décidera par exemple de supprimer son adresse et son titre.
>delete monauteur.adresse
>delete monauteur.titre
Lorsque la suppression est terminée, nous devons impérativement sauvegarder la variable monauteur dans la collection.
>db.auteur.save(monauteur)
Le document est ainsi sauvegardé.
Effectuons à nouveau une requête pour lister les documents et vérifions.
>db.auteur.findOne({"nom":"f-leb"})
Le titre et l'adresse ont bel et bien été supprimés.
VII-C-3. Avec drop▲
Cette méthode permet de supprimer une collection de la base de données. Voici sa syntaxe.
>db.nom_de_la_colection.drop()
Supprimons une collection nommée testt.
La valeur trueindique que la collection existe et qu'elle a été supprimée. Dans le cas contraire, la valeur false aurait été retournée.
VIII. MongoDB et ses $opérateurs ▲
MongoDB dispose de plusieurs opérateurs commençant par le caractère $. Ces opérateurs permettent certaines actions ou opérations sur les documents et/ou les collections de la base de données en cours d'utilisation.
VIII-A. Le $set▲
Cet opérateur permet de modifier la valeur d'un champ. Si le champ existe, il est mis à jour. Dans le cas contraire, il est ajouté au document.
Exemple : nous ajoutons un auteur :
>db.auteur.insert({"nom":"andrestevejob","prenom" :"user_test","titre" :"redacteur"})
Maintenant essayons notre opérateur $setavec les deux exemples ci-dessous :
>db.auteur.update({"nom" :"andrestevejob"},{"$set":{"prenom" :"test_user_prenom"}})
Voici donc le contenu du document lorsque nous effectuons un findOnepour la première méthode :
>db.auteur.update({"nom" :"andrestevejob"},{"$set":{"titre" :"Rédacteur et modérateur"}})
Pour la deuxième méthode, le résultat est affiché ci-dessous :
La première méthode modifie la valeur du prénom qui était user_test à test_user_prenom, tandis que la deuxième méthode ajoute le champ titre avec comme valeur Rédacteur et Modérateur.
VIII-B. Le $unset▲
Cet opérateur permet de supprimer un champ si celui-ci existe et ne fait rien dans le cas contraire. Voici comment il s'utilise :
>db.auteur.update({"cle":"valeur"},{"$unset":{"nom_du_champ" :"la_valeur_du_champ"}})
VIII-C. Le $inc▲
Celui-là est utilisé pour effectuer une incrémentation, il n'est utilisable que sur les valeurs numériques :
>db.auteur.update({"cle":"valeur"},{"$inc":{"nom_du_champ":valeur_a_ajouter}})
VIII-D. Le $push▲
Cet opérateur permet d'ajouter des éléments à la fin d'un tableau si ce dernier existe et dans le cas contraire, il le crée. Pour notre collection d'auteurs du site Developpez, supposons qu'il faille ajouter des informations telles que leurs articles. C'est dans ce cas précis que cet opérateur intervient :
>db.auteur.update({"cle":"valeur"},{"$push" :{"nom_du_champ":{"cle" :"valeur"}}})
À titre d'exemple, ajoutons les articles du membre et rédacteur de djibril.
>db.auteur.update({"nom":"djibril"},{"$push":{"articles":{"libelle" :"test","datepublication":new Date(),"nombrepage":124,"url" :"https://developpez.com/djibril/cours/perl"}}})
VIII-E. Le $each▲
Cet opérateur permet d'ajouter des informations de façon consécutive pour un champ donné. Mais il s'utilise avec l'opérateur précédent :
>db.auteur.update({"cle":"valeur"},{"$push":{"la_valeur_du_champ":{"$each":[valeur_1,valeur_2,...,valeur_n]}}})
Ajoutons par exemple les numéros de notre Communitity Manager Lana Bauer.
>db.auteur.update({"nom":"Lana"},{"$push":{"numeros":{"$each" :[6655121,52415254,857121]}}})
VIII-F. Le $slice▲
Il permet de limiter un nombre d'éléments à insérer. Partant de l'exemple précédent, cet opérateur nous permettra par exemple de limiter le nombre de numéros à une valeur numérique n.
Lorsque la modification est effectuée, le document est sauvegardé tout en prenant en compte les derniers n éléments fournis . Il s'utilise de la manière suivante :
>db.auteur.update({"cle":"valeur"},{"$push":{"la_valeur_du_champ":{"$each":[valeur_1,valeur_2,...,valeur_n],"$slice":nombre_limite}}})
>db.auteur.update({"nom":"Lana"},{"$push":{"articles":{"$each":["article_1","article_2","article_3","article_4","article_5","article_6"],"$slice":4}}})
IX. Conclusion et remerciements▲
Cet article met en exergue une utilisation primaire, simple et basique de MongoDB à travers des exemples d'insertion, de mise à jour et l'utilisation de certains opérateurs de MongoDB.
Tous les tutoriels publiés sur le site Developpez passent par différentes étapes avant d'être connus du grand public. C'est pour cela que j'adresse mes sincères remerciements à Lana Bauer, djibril, zoom61, Francis Walter et bien d'autres.