Le but de ce billet est d’effectuer une première incursion dans l’univers MongoDB en voyant les commandes de bases dans le shell mongo et en faisant un parallèle avec ce qui existe dans le monde du SQL. Nous allons commencer en manipulant les bases : bases de données, collections et documents. Le but n’est pas de se noyer d’emblée dans l’architecture interne de Mongo (le sharding, les replica sets, etc.) mais d’attaquer d’emblée des choses concrètes !
Installation de MongoDB sur GNU Linux Debian
Nous allons faire les choses proprement au lieu d’insérer à la sauvage dans le fichier sources.list. Vous devez évidemment être sudoer pour effectuer ceci :
echo 'deb http://downloads-distro.mongodb.org/repo.fr.ian-sysvinit dist 10gen' > /tmp/mongodb.list sudo cp /tmp/mongodb.list /etc/apt/sources.list.d/ rm /tmp/mongodb.list sudo apt-get update sudo apt-get install mongodb-10gen
A l’issue de l’installation, le serveur MongoDB doit être démarré automatiquement (le daemon mongod pour être plus précis).
Les principales commandes
Lancer le shell
Tout part de là ! En tapant « mongo » vous devriez y accéder car /bin doit être dans votre PATH. Si vous rencontrez des problèmes, lancez
/usr/bin/mongo
Quitter le shell
Rien de plus simple: faites donc Ctrl+C (ce bon vieux SIGINT !) ou tapez exit à l’invite, vous sortirez du shell.
Obtenir le numéro de version
Les données concernant votre installation apparaissent sous la forme d’un objet JSON, la commande a exécuter est en gras :
> db.runCommand({buildinfo: 1}); { "version" : "2.0.6", "gitVersion" : "nogitversion", "sysInfo" : "Linux z6 3.8-trunk-amd64 #1 SMP Debian 3.8.3-1~experimental.1 x86_64 BOOST_LIB_VERSION=1_49", "versionArray" : [ 2, 0, 6, 0 ], "bits" : 64, "debug" : false, "maxBsonObjectSize" : 16777216, "ok" : 1 }
Lister les bases de données
La commande permettant de faire ça est show dbs.
sebastien.ferrandez@sebastien:~$ mongo MongoDB shell version: 2.0.6 connecting to: test > show dbs; local (empty)
Comme je viens d’installer MongoDB, rien d’étonnant à ce qu’aucune base de données n’apparaisse ! Il est possible d’obtenir davantage d’informations en utilisant la base de données admin dont l’usage est réservé comme son nom l’indique à l’admin.
> use admin switched to db admin > db.runCommand({listDatabases: 1}); { "databases" : [ { "name" : "local", "sizeOnDisk" : 1, "empty" : true } ], "totalSize" : 0, "ok" : 1 }
Créer une collection
La collection en langage MongoDB est l’équivalent de la table en relationnel, on les crée soit en y insérant le tout premier document (l’équivalent du tuple en relationnel) soit en exécutant la commande suivante :
> db.createCollection('gens'); { "ok" : 1 }
Insérer un document dans une collection
Notre collection s’appelle gens, insérons-y un premier document :
db.gens.insert( { nom: "ferrandez", prenom:"sebastien", age: 35 } );
Lister les documents contenus dans une collection
Pour faire l’équivalent d’un SELECT * FROM gens, j’utilise la commande find sans paramètres :
> db.gens.find(); { "_id" : ObjectId("517941f3b12e1948c04f6d5e"), "nom" : "ferrandez", "prenom" : "sebastien", "age" : 35 }
Insérons un nouveau document et observons le changement dans le find :
> db.gens.insert( { nom: "ferrandez", prenom:"sandrine", age: 34, sexe:"F" } ); > db.gens.find(); { "_id" : ObjectId("517941f3b12e1948c04f6d5e"), "nom" : "ferrandez", "prenom" : "sebastien", "age" : 35 } { "_id" : ObjectId("51794334b12e1948c04f6d5f"), "nom" : "ferrandez", "prenom" : "sandrine", "age" : 34, "sexe" : "F" }
Notez que, contrairement à une table, le nombre de champs n’est pas contraint par l’intention du schéma, en effet mon deuxième document a un champ de plus que le premier : sexe.
Dans les objets JSON que j’enregistre, un champ _id est déterminé par MongoDB. Il est évidemment tout à fait possible de forcer le sien :
> db.gens.insert( { _id: 10, nom: "ferrandez", prenom:"christophe", age: 40 } ); > db.gens.find(); { "_id" : ObjectId("517941f3b12e1948c04f6d5e"), "nom" : "ferrandez", "prenom" : "sebastien", "age" : 35 } { "_id" : ObjectId("51794334b12e1948c04f6d5f"), "nom" : "ferrandez", "prenom" : "sandrine", "age" : 34, "sexe" : "F" } { "_id" : 10, "nom" : "ferrandez", "prenom" : "christophe", "age" : 40 }
Il est possible de manipuler des identifiants auto-incrémentés mais si vous insistez pour utiliser ce mécanisme offert par certains SGBDR comme MySQL c’est peut-être que vous avez une vision trop « relationnelle » de vos données ! Si toutefois vous persistiez à vouloir bénéficier de ce mécanisme, vous trouverez le lien à la fin de ce billet.
Supprimer une collection
Il vous faut utiliser drop, comme en SQL !
> db.gens.drop(); true
Supprimer une base de données
Deux manières de procéder, en faisant un use pour se connecter à la base de données à effacer :
> show dbs; admin 0.203125GB gens 0.203125GB local (empty) > use gens; switched to db gens > db.runCommand({dropDatabase: 1}); { "dropped" : "gens", "ok" : 1 } > show dbs; admin 0.203125GB local (empty)
ou bien en exécutant directement :
> db.gens.runCommand({dropDatabase: 1}); { "dropped" : "gens", "ok" : 1 }
Pour aller plus loin…
Au sujet des identifiants auto-incrémentés : La documentation MongoDB (anglais)
Merci pour votre introduction très claire, cependant un point m’échappe 🙂
on crée une collection nommée GENS, ça ok, mais à la fin il est question d’effacer une base de donnée gens … ca ne fonctionne pas chez moi.
Newbie que je suis, ais je zappé un point, ou s’agit il d’une coquille et dans ce cas la syntaxe pour créer un ebase est bienvenue 🙂
Bonjour Yannick,
Lorsque vous faites un use, MongoDB prépare en quelque sorte une base de données « temporaire », c’est lorsque vous y insérerez EFFECTIVEMENT des données qu’elle sera alors définitivement créée.
Il n’y a pas de commande de création explicite comme en SQL.