1. Présentation
MongoDB est une base de données NoSQL multiplateforme, orientée document et open source, écrite en C++. De plus, MongoDB offre des performances élevées, une haute disponibilité et une mise à l'échelle automatique.
Afin de mettre à jour les documents dans MongoDB, nous pouvons utiliser différentes méthodes comme updateOne , findOneAndUpdate, etc. De plus, MongoDB fournit divers opérateurs pour les méthodes de mise à jour.
Dans ce didacticiel, nous aborderons différentes approches pour effectuer des opérations de mise à jour dans MongoDB. Pour chaque approche, nous allons d'abord discuter de la requête shell mongo, puis de son implémentation en Java.
2. Configuration de la base de données
Avant de passer aux requêtes de mise à jour, créons d'abord une base de données, baeldung , et une collection d'échantillons, étudiant :
use baeldung;
db.createCollection(student);
A titre d'illustration, ajoutons quelques documents dans la collection étudiant en utilisant insertMany requête :
db.student.insertMany([
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 1",
"age": 16,
"roll_no":199406
},
{
"student_id": 8765,
"student_name": "Andrew Boult",
"address": "Hostel 2",
"age": 18,
"roll_no":199408
}
]);
En cas d'insertion réussie, nous obtiendrons un JSON avec acknowledged:true :
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("621b078485e943405d04b557"),
ObjectId("621b078485e943405d04b558")
]
}
Plongeons maintenant dans les différentes manières de mettre à jour les documents dans MongoDB.
3. Utilisation de updateOne Méthode
Une opération de mise à jour dans MongoDB peut être effectuée en ajoutant un nouveau champ, en supprimant un champ ou en mettant à jour un champ existant. Le updateOne met à jour un seul document dans une collection en fonction du filtre de requête appliqué. Il trouve d'abord le document qui correspond au filtre, puis met à jour les champs spécifiés.
De plus, nous pouvons utiliser différents opérateurs tels que $set , $unset , $inc , etc., avec la méthode de mise à jour.
Pour illustrer, examinons la requête pour mettre à jour un seul document d'une collection :
db.student.updateOne(
{
"student_name" : "Paul Starc"
},
{
$set: {
"address" : "Hostel 2"
}
}
);
Nous obtiendrons une sortie similaire à celle illustrée ci-dessous :
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Voyons maintenant le code du pilote Java de la updateOne ci-dessus requête :
UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));
Ici, nous avons d'abord utilisé le student_name champ pour filtrer les documents. Ensuite, nous mettons à jour l'adresse du document avec student_name "Paul Starc".
4. Utilisation de updateMany Méthode
Le updateMany met à jour tous les documents des collections MongoDB qui correspondent au filtre donné. L'un des avantages de l'utilisation de updateMany est que nous pouvons mettre à jour plusieurs documents sans perdre les champs des anciens documents.
Voyons la requête shell MongoDB en utilisant updateMany méthode :
db.student.updateMany(
{
age: {
$lt: 20
}
},
{
$set:{
"Review" : true
}
}
);
La commande ci-dessus renverra la sortie suivante :
{
"acknowledged":true,
"matchedCount":2,
"modifiedCount":2
}
Ici, matchedCount contient le nombre de documents correspondants, alors que modifiedCount contient le numéro des documents modifiés.
Regardons maintenant le code du pilote Java en utilisant le updateMany méthode :
UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));
Ici, tous les documents avec âge moins de 20 seront filtrés, et l'Avis le champ sera défini sur true .
5. Utilisation de replaceOne Méthode
Le replaceOne méthode de MongoDB remplace l'intégralité du document. L'un des inconvénients du replaceOne est que tous les anciens champs seront remplacés par les nouveaux champs, et les anciens champs seront également perdus :
db.student.replaceOne(
{
"student_id": 8764
},
{
"student_id": 8764,
"student_name": "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
}
);
Dans ce cas, nous obtiendrons le résultat suivant :
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Si aucune correspondance n'est trouvée, l'opération renvoie le matchedCount comme 0 :
{
"acknowledged":true,
"matchedCount":0,
"modifiedCount":0
}
Écrivons le code du pilote Java correspondant en utilisant le replaceOne méthode :
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age",18)
.append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);
Dans le code ci-dessus, nous avons créé un document par lequel l'ancien document sera remplacé. Le document avec student_id 8764 sera remplacé par le document nouvellement créé.
6. Utilisation de findOneAndReplace Méthode
Le findOneAndReplace est l'une des méthodes de mise à jour avancées fournies par MongoDB, et elle remplace le premier document correspondant en fonction des critères de sélection donnés. Par défaut, cette méthode renvoie le document d'origine. Nous pouvons utiliser différentes options de findOneAndReplace pour trier et projeter des documents si nécessaire.
En bref, findOneAndReplace remplace le premier document correspondant de la collection en fonction du filtre appliqué :
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
returnNewDocument: false
}
);
Cette requête renverra le document suivant :
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 1",
"age":16,
"roll_no":199406
}
Si nous définissons returnNewDocument à vrai , l'opération renverrait alors le document remplacé à la place :
{
"student_id":8764,
"student_name":"Paul Starc",
"address":"Hostel 2",
"age":18,
"roll_no":199406
}
Utilisons maintenant findOneAndReplace méthode pour projeter le student_id et âge champs dans le document renvoyé :
db.student.findOneAndReplace(
{
"student_id" : {
$eq : 8764
}
},
{
"student_id" : 8764,
"student_name" : "Paul Starc",
"address": "Hostel 2",
"age": 18,
"roll_no":199406
},
{
projection: {
"_id" : 0,
"student_id":1,
"age" : 1
}
}
);
La sortie de la requête ci-dessus ne contiendra que les champs projetés :
{
"student_id":"8764",
"age":16
}
Le code du pilote Java de la requête ci-dessus avec diverses options de findOneAndReplace :
Document replaceDocument = new Document();
replaceDocument
.append("student_id", 8764)
.append("student_name", "Paul Starc")
.append("address", "Hostel 2")
.append("age", 18)
.append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
Filters.eq("student_id", 8764),
replaceDocument,
new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));
Dans la requête ci-dessus, le findOneAndReplace triera d'abord les documents par ordre croissant en fonction de roll_no, et le document nouvellement créé remplace le document par student_id "8764".
7. Utilisation de findOneAndUpdate Méthode
Le findOneAndUpdate met à jour le premier document correspondant dans la collection. Si plusieurs documents correspondent aux critères de sélection, seul le premier document correspondant est mis à jour. Lorsque nous mettons à jour le document, la valeur du _id le champ reste inchangé :
db.student.findOneAndUpdate(
{
"student_id" : 8764
},
{
$inc : {
"roll_no" : 5
}
},
{
sort: {
"roll_no" : 1
},
projection: {
"_id" : 0,
"student_id":1,
"address" : 1
}
}
);
La sortie de la requête ne contiendra que le studentId et adresse de l'ancien document :
{
"student_id":8764,
"address":"Hostel 1"
}
Le code du pilote Java de la requête ci-dessus, en utilisant différentes options de findOneAndUpdate est la suivante :
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
Filters.eq("student_id", 8764),
Updates.inc("roll_no", 5),
new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));
Dans ce cas, le findOneAndUpdate la méthode triera d'abord le document dans l'ordre croissant en fonction de roll_no . La requête ci-dessus incrémente le roll_no par 5 puis renvoie le student_id et adresse champs.