MongoDB (partie2) : découverte des fonctions depuis le Shell mongo • Domotique et objets connectés à faire soi-même

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.

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
  • upsert : boolean. Si vrai créé un nouveau document lorsqu’aucun document n’est renvoyé par la requête de recherche
  • multi : boolean. Par défaut, la fonction update actualise un seul document. On peut aussi utiliser la nouvelle fonction updateMany() à partir de la version 3.2
  • writeConcern : boolean.

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 ?