Nous continuons notre série d’article sur MongoDB. MongoDB dispose d’un shell qui permet d’exécuter toutes les méthodes proposées par MongoDB. Dans ce tutoriel nous apprendre les principales méthodes pour créer une collection, insérer, mettre à jour, supprimer des documents dans une collection et comment faire des recherches.
Sommaire
- 1 Découverte du Shell Mongo
- 2 Type de données supportées
- 3 Créer une Database (use)
- 4 Supprimer une base de données (databaseDrop)
- 5 Créer une collection (createCollection)
- 6 Syntaxe
- 7 Exemples
- 8 Effacer une collection (db.COLLECTION.drop)
- 9 Syntaxe
- 10 Exemple
- 11 Insérer un document (insert ou save)
- 12 Syntaxe
- 13 Exemples
- 14 Utiliser la commande save() pour mettre à jour un document
- 15 Mettre à jour un document (save ou update)
- 16 Syntaxe
- 17 Exemple
- 18 Mettre à jour un document avec la commande save()
- 19 Supprimer un ou plusieurs documents (remove)
- 20 Syntaxe
- 21 Exemples
- 22 Rechercher des documents (find)
- 23 Syntaxe
- 24 Exemple de recherche simple
- 25 Equivalence des conditions de recherche avec une base de données relationnelle
- 26 Opérateurs logiques (AND, OR)
- 27 Limiter les résultats de recherche (limit)
- 28 Décaler les résultats (skip)
- 29 Trier les résultats (sort)
Découverte du Shell Mongo
On peut tout faire depuis le Shell, créer des bases, ajouter des enregistrements, faire des recherches… Nous allons découvrir les principales commandes ainsi que quelques exemples d’application.
Démarrez MongoDB dans un Terminal avec la commande mongod. Ouvrez une nouvelle fenêtre dans le Terminal et démarrez le Shell à l’aide de la commande mongo.
Commande | Fonction |
db | Sur quel base on travaille |
use | Changer de base de données |
show dbs | Liste des bases de données dans la base actuelle (l’équivalent d’une table dans mysql) |
databaseDrop() | Supprimer la base de données en cours d’utilisation |
createCollection | Créé une nouvelle collection (regroupement de documents) dans la base de données en cours d’utilisation |
db.COLLECTION.drop | Supprime la collection “COLLECTION” |
insert() | Insertion (création) d’un document dans la collection courante (ou la base de données) |
save() | Remplace le contenu du document portant l’identifiant _id spécifié |
update() | Met à jour un ou plusieurs documents |
find() | Rechercher un ou documents |
On sort du shell avec la commande exit.
Type de données supportées
Voici les types de données les plus courants supportés par MongoDB
String | Chaine de caractère au format UTF-8 |
Integer | Pour stocker des données numériques entières (32 ou 64 bits en fonction du serveur) |
Boolean | Pour les valeurs vrai/faux (true/false) |
Double | Donnée numérique décimale à virgule flottante |
Array | Pour enregistrer des données sous la forme d’un tableau. |
Timestamp | Horodatage de création, modification d’un document |
Null | Donnée nulle |
Date | Date ou heure courante au format UNIX |
ObjectId | Identifiant unique d’un document |
Créer une Database (use)
La commande use NOM_DATABASE permet de changer la base courante et d’utiliser la base indiquée. Elle sera créée automatiquement si elle n’existe.
Par exemple, nous allons créer une base mysensors dans laquelle nous stockerons toutes les mesures en provenance de capteurs MySensors
>use mysensors Switched to db mysensors
Pour vérifier la base de données en cours d’utilisation, on utilise la commande db
>db mysensors
Pour lister les bases, on utilise la commande show dbs
> show dbs local 0.012GB mysensors 0.029GB
Supprimer une base de données (databaseDrop)
La commande db.dropDatabase() permet de supprimer la base de données courante.
Créons un table test
>use test Switched to db test
On insert un enregistrement
>db.test.insert({titre:'Un Titre'}) WriteResult({ "nInserted : 1 })
On vérifie que la base test existe
show dbs local 0.012GB mysensors 0.029GB test 0.000GB
On change la base courante et on la supprime
>use test Switched to db test >db.dropDatabase() >{ "dropped" : "test", "ok" : 1} >show dbs local 0.012GB mysensors 0.029GB >
Créer une collection (createCollection)
On peut classer les documents dans une collection. Ce n’est pas obligatoire. Il est possible d’enregistrer des documents directement dans une base de données. Si vous avez de nombreux documents, il est préférable de le regrouper par collection pour de meilleures performances (et plus de clarté).
Syntaxe
db.createCollection(name, options)
Paramètre | Type | Description |
Name | Chaine | Nom de la collection à créer |
Options | Document | (optionnel). Document permettant de spécifier des options complémentaires (tableau ci-dessous) |
Il n’y a que le nom de la collection qui est obligatoire. D’autres options sont optionnelles. Elles doivent être au format document {cle1:valeur, cle1: valeur}.
Champ (clé) | Type | Description |
capped | Booléen | Taille maximale de la collection. Les anciens documents sont effacés lorsque la taille maximale (size) est atteinte. Le paramètre size doit obligatoirement être renseigné si vrai. |
autoIndexID | Booléen | Si true, un index est automatiquement créé sur le champ _id. False par défaut. |
size | Nombre | Taille maximale en bytes de la collection |
max | Nombre | Nombre maximum d’enregistrement dans la collection. |
Exemples
On créé une collection “macollection” sans aucune option
>use test switched to db test >db.createCollection("macollection") { "ok" : 1 } >
Une seconde en spécifiant une taille et un nombre de documents à ne pas dépasser.
>db.createCollection("macollection2", { capped : true, autoIndexID : true, size : 5000000, max : 10000 } ) { "ok" : 1 } >
Effacer une collection (db.COLLECTION.drop)
On supprime une collection avec la commande db.collection.drop()
Syntaxe
db.NOM_COLLECTION.drop()
Exemple
On liste les collections de la base de données test et on supprime la collection “macollection”.
>use test switched to db test >show collections macollection macollection2 >
Insérer un document (insert ou save)
La commande insert() permet d’insérer un document (en enregistrement) dans la collection ou la base de données indiquée.
Syntaxe
db.NOM_COLLECTION.insert(document) ou db.NOM_BASEDEDONNEES.insert(document)
Depuis la version 3.2, il existe 2 nouvelles fonctions (plus pour respecter le formaliste des autres fonctions que par réel intérêt).
db.collection.insertOne() | Insert un document unique dans la collection |
db.collection.insertMany() | Insert plusieurs documents |
Exemples
On insert un document en précisant son identifiant unique
>db.macollection.insert({ _id: ObjectId(8gh545c1), titre: 'Découverte de MongoDB', description: 'Installation et découverte de la base de données NoSQL MongoDB', par: 'Projets DIY', url: 'http://www.projetsdiy.fr', tags: ['mongodb', 'database', 'NoSQL'] })
Il est possible d’insérer plusieurs documents dans une même commande insert. Dans cet exemple, on laisse MongoDB attribuer un identifiant automatiquement à chaque document.
>db.macollection.insert([{ titre: 'Découverte de MongoDB', description: 'Installation et découverte de la base de données NoSQL MongoDB', par: 'Projets DIY', url: 'http://www.projetsdiy.fr', tags: ['mongodb', 'database', 'NoSQL'] }, { titre: 'Utiliser MongoDB avec Mode-RED', description: 'Enregistrer vos données dans MongoDB avec Mode-RED', par: 'Projets DIY', url: 'http://www.projetsdiy.fr', tags: ['mongodb', 'Node-RED'] } ]) BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] }) >
Utiliser la commande save() pour mettre à jour un document
On peut également utiliser la commande save à la place d’insert. Si on ne spécifie pas d’identifiant _id, la méthode save fonctionne comme la méthode insert. Si on précise l’identifiant, le contenu du document portant cet identifiant sera remplacé par le nouveau contenu.
Mettre à jour un document (save ou update)
La commande update() permet de mettre à jour un document
Syntaxe
db.NOM_COLLECTION.update(requête,update,{option:valeur})
requête | document | Une requête de recherche |
update | document | Les modifications à appliquer |
option | paramètres optionnels |
|
Depuis la version 3.2, il existe 3 nouvelles fonctions
db.collection.updateOne() | Met à jour un document correspondant au filtre de recherche |
db.collection.updateMany() | Met à jour tous les documents qui correspondent au filtre |
db.collection.replaceOne() | Remplace le contenu d’un document correspondant au filtre |
Exemple
On modifie le titre de l’article “Découverte de MongoDB”
> db.macollection.update({"titre":"Découverte de MongoDB"},{$set:{"titre":"Installation et découverte de MongoDB"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.macollection.find() { "_id" : ObjectId("581a10809858b84ce1cf40a1"), "titre" : "Installation et découverte de MongoDB", "description" : "Installation et découverte de la base de données NoSQL MongoDB", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "database", "NoSQL" ] } { "_id" : ObjectId("581a10809858b84ce1cf40a2"), "titre" : "Utiliser MongoDB avec Mode-RED", "description" : "Enregistrer vos données dans MongoDB avec Mode-RED", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "Node-RED" ] } >
Mettre à jour un document avec la commande save()
La commande save() permet également de remplacer le contenu d’un document lorsqu’on précise un _id existant.
Supprimer un ou plusieurs documents (remove)
La commande remove() permet de supprimer un document (ou plusieurs document) correspondant au(x) critère(s).
Syntaxe
db.NOM_COLLECTION.remove(CRITERE, justOne)
si JustOne vaut 1, un seul enregistrement sera effacé.
Depuis la version 3.2, il existe deux nouvelles fonctions
db.collection.deleteOne() | Efface un document correspondant au filtre de recherche |
db.collection.deleteMany() | Efface plusieurs documents qui correspondent au filtre |
Exemples
Effacer un document en indiquant un _id
On doit indiquer à MongoDB que c’est un identifiant de document avec la type ObjectId.
>db.macollection.remove({_id:ObjectId("581a0bb89858b84ce1cf409e")}) WriteResult({ "nRemoved" : 1 }) >
Effacer les documents qui correspondent à un critère
La collection contient actuellement les documents suivants
> db.macollection.find() { "_id" : ObjectId("581a0cf49858b84ce1cf409f"), "titre" : "Découverte de MongoDB", "description" : "Installation et découverte de la base de données NoSQL MongoDB", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "database", "NoSQL" ] } { "_id" : ObjectId("581a0cf49858b84ce1cf40a0"), "titre" : "Utiliser MongoDB avec Mode-RED", "description" : "Enregistrer vos données dans MongoDB avec Mode-RED", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "Node-RED" ] }
On souhaite effacer le document portant le titre “Découvert de MongoDB”, pour cela il suffit d’exécuter
> db.macollection.remove({"titre":"Découverte de MongoDB"}) WriteResult({ "nRemoved" : 1 }) > db.macollection.find() { "_id" : ObjectId("581a0cf49858b84ce1cf40a0"), "titre" : "Utiliser MongoDB avec Mode-RED", "description" : "Enregistrer vos données dans MongoDB avec Mode-RED", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "Node-RED" ] } >
Effacer tous les documents d’une collection
Avec cette commande, on efface en seule commande tout le contenu de la collection “macollection”
db.macollection.remove({})
Rechercher des documents (find)
La méthode find() permet de faire des recherche sur une collection ou une base de données
Syntaxe
db.NOM_COLLECTION.find()
La méthode findOne() permet de ne renvoyer qu’un seul document.
Exemple de recherche simple
Tous les documents de la collection “macollection”
> db.macollection.find() { "_id" : ObjectId("581a10809858b84ce1cf40a1"), "titre" : "Installation et découverte de MongoDB", "description" : "Installation et découverte de la base de données NoSQL MongoDB", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "database", "NoSQL" ] } { "_id" : ObjectId("581a10809858b84ce1cf40a2"), "titre" : "Utiliser MongoDB avec Mode-RED", "description" : "Enregistrer vos données dans MongoDB avec Mode-RED", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "Node-RED" ] }
Ce n’est pas très facile à lire. Ajoutons la méthode pretty() pour rendre la présentation plus lisible par un être humain.
db.macollection.find().pretty() { "_id" : ObjectId("581a10809858b84ce1cf40a1"), "titre" : "Installation et découverte de MongoDB", "description" : "Installation et découverte de la base de données NoSQL MongoDB", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "database", "NoSQL" ] } { "_id" : ObjectId("581a10809858b84ce1cf40a2"), "titre" : "Utiliser MongoDB avec Mode-RED", "description" : "Enregistrer vos données dans MongoDB avec Mode-RED", "par" : "Projets DIY", "url" : "http://www.projetsdiy.fr", "tags" : [ "mongodb", "Node-RED" ] }
Equivalence des conditions de recherche avec une base de données relationnelle
MongoDB utilise des mots clés qui commencent par $. Voici un tableau comparatif pour trouver l’opérateur équivalent par rapport à une base de données relationnelle classique (MySQL, SQL Server…).
Operation | Syntaxe | Example | Equivalent à (SQL) |
---|---|---|---|
Egalité
Equality |
{:} | db.macollection.find({“by”:”tutorials point”}).pretty() | where by = ” |
Strictement inférieur
Less Than |
{:{$lt:}} | db.macollection.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
Inférieur ou égal
Less Than Equals |
{:{$lte:}} | db.macollection.find({“likes”:{$lte:50}}).pretty() | where likes 50 |
Supérieur ou égal
Greater Than Equals |
{:{$gte:}} | db.macollection.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
Différent
Not Equals |
{:{$ne:}} | db.macollection.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
Opérateurs logiques (AND, OR)
On peut également utiliser des opérateurs logiques AND, OU dans une requête de recherche.
>db.mycol.find( { $and: [ {key1: value1}, {key2:value2} ] } ).pretty()
Limiter les résultats de recherche (limit)
La méthode limit(NOMBRE) permet de limiter de nombre de résultats renvoyé par la méthode find(). On ne récupère que 5 documents
db.macollection.find().limit(5)
Décaler les résultats (skip)
La méthode skip(NOMBRE) permet de “passer” les n premiers résultats renvoyés.
Trier les résultats (sort)
La méthode sort({clé:valeur}) permet de trier les résultats de la recherche.
Par exemple si on veut récupérer les ouvrages par ordre alphabétique
.sort({ “titre” : 1 })
Depuis Z
.sort({ “titre” : -1 })
Recherche de document avec find(). Affichage plus lisible (standard JSON) avec pretty().
Il existe encore beaucoup d’autres fonctions à découvrir (indexation, agrégation de données, réplication, sauvegarde…). Ce premier aperçu devrait vous permettre de commencer à découvrir toute la puissance de MongoDB pour des projets domotiques, objets connectés et pourquoi pas pour des projets professionnels.
Sources :
Avez-vous aimé cet article ?