6. Les requêtes de modification

  • Auteurs : Rémi Leduc, Léo Rouger, Clément Caillard

Ce chapitre traite des différentes requêtes de modification (insertion, modification et suppression).

6.1. Insertion

Pour la création d’une nouvelle collection, il est nécessaire de sélectionner une base. Si elle n’existe pas, elle sera alors créée.

use voitures
switched to db voitures

6.1.1. Création d’une collection

Il est nécessaire d’utiliser la commande db.createCollection("NomDeLaNouvelleCollection") pour créer une nouvelle collection au sein de la base sélectionnée.
Exemple:

db.createCollection("ventes")
{ "ok" : 1 }

Ici, on crée par exemple une collection “ventes” au sein de la base “voitures”.

Attention

Si vous tentez d’exécuter plusieurs fois la commande, une erreur surviendra car votre collection existe déjà.

6.1.2. Ajout de nouveaux documents

La commande db.NomDeLaCollection.insert([]) permet l’ajout d’une liste de document au sein de la collection.
Exemple:

db.ventes.insert([{"nom" : "C1"}, {"nom" : "C2"}])
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})

Si on exécute la ligne suivante, on retrouve bien les documents créés :

db.ventes.find({})
{ "_id" : ObjectId("62309af7bf52a8ffeec8c555"), "nom" : "C1" }
{ "_id" : ObjectId("62309af7bf52a8ffeec8c556"), "nom" : "C2" }

6.2. Modification

6.2.1. Remplacement d’un document

db.ventes.update(
	{"nom": "C1"},
	{"nom": "C1", "marque": "Citroën"}
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Le document sélectionné sur la première ligne est supprimé et remplacé selon les champs renseignés sur la seconde ligne. Les champs qui ne sont pas renseignés sont donc supprimés.

Attention

Seul le premier document de la liste sera modifié.

6.2.2. Modification d’un document

Si l’on souhaite conserver les autres champs, il suffit d’inclure la seconde ligne dans un $set.

db.ventes.update(
	{"nom": "C2"},
	{$set:
		{"marque": "Citroën"}
	}
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ici également, seul le premier document de la liste répondant aux critères de la première ligne sera modifié.

6.2.3. Modification de plusieurs documents

Pour modifier plusieurs documents à la fois, il est nécessaire d’ajouter {multi: true} en fin de requête.

db.ventes.update(
	{"nom" : {$in: ["C1", "C2"]}},
	{$set: {"pays": "France"}},
	{multi: true}
)
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })

Cette requête, par exemple, ajoute un attribut “pays” ayant la valeur “France” aux modèles C1 et C2.

6.2.4. Upsert

L’option upsert (mélange de “update” et “insert”) permet de mettre une condition sur la requête : si aucun document ne correspond aux conditions indiquées en première ligne, alors un nouveau document est créé par les champs renseignés sur la seconde ligne.

db.ventes.update(
	{"nom": "C1"},
	{$set : {"nom": "C1", "Nombre de roues": 4}},
	{upsert: true}
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ici, on ajoute une nouvelle variable “Nombre de roues” à laquelle on attribue la valeur 4 au modèle “C1”.

db.ventes.update(
	{"nom": "Twingo"},
	{$set : {"Nombre de roues": 4}},
	{upsert: true}
)
WriteResult({
	"nMatched" : 0,
	"nUpserted" : 1,
	"nModified" : 0,
	"_id" : ObjectId("62309af7e5a11a212c4cf635")
})

Cette fois-ci, un nouveau document est ajouté à la base.

6.3. Suppression

Comme toutes les bonnes choses ont une fin, il est possible de supprimer une base, ou bien, sans être aussi radical, des éléments plus précis. Nous allons voir ici comment procéder aux différentes suppressions :

6.3.1. Suppression d’une base entière

db.dropDatabase()

Lors de l’exécution de cette commande, c’est la base courante, celle qui est pointée par db, qui sera supprimée.

Important !

Notez bien que tous les index qui pouvaient exister dans les collections de cette base seront également supprimés !

6.3.2. Suppression d’une collection

db.nomDeLaCollection.drop()

Ici encore, les index éventuellement présents dans la collection supprimée seront eux aussi effacés.

6.3.3. Suppression de documents dans une collection

Nous voilà arrivés au gros morceau… Lorsque l’on veut supprimer certains documents en particulier sans toucher aux index, il faut utiliser la commande suivante :

db.nomDeLaCollection.remove({})

Lorsque l’on passe en argument un document vide, comme dans l’exemple ci-dessus, on supprime toutes les données contenues dans la collection, mais on en conserve la structure, donc les index.

La fonction remove peut également recevoir des documents précis en argument :

  • Condition sous la forme d’un document masque :
    Tous les documents correspondants à la sélection seront supprimés, par exemple tous ceux dont l’attribut “marque” correspond à “Citroën” :

db.ventes.remove({"marque" : "Citroën"})
WriteResult({ "nRemoved" : 2 })
  • Suppression d’un seul document :
    Pour ce faire, il convient d’utiliser l’attribut “_id” puisqu’il est unique :

db.nomDeLaCollection.remove({"_id" : ObjectId("5612c6c0a5c56580cfacc342")})

Et voilà, vous savez tout sur la création, la suppression et la modification de bases !