Exemple de MongoDB findAndModify()

La méthode findAndModify() de MongoDB modifie et renvoie un seul document en fonction des critères de sélection saisis. Le document renvoyé n’affiche pas le contenu mis à jour par défaut. Si les enregistrements correspondant aux critères n’existent pas dans la base de données, un nouvel enregistrement sera inséré si l’option upsert est définie sur true.

MongoDB findAndModify()

La syntaxe de la méthode findAndModify de MongoDB est la suivante.

db.collection.findAndModify({
    query: <document>,
    sort: <document>,
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>
})

La description des paramètres est la suivante. query: Définit les critères de sélection pour lesquels l’enregistrement doit être modifié. sort: Détermine le document qui doit être modifié lorsque les critères de sélection renvoient plusieurs documents. new: indique que le document modifié sera affiché. fields: spécifie l’ensemble de champs à renvoyer. upsert: crée un nouveau document si les critères de sélection ne renvoient pas de document.

Points importants concernant findAndModify dans MongoDB

Voici quelques points à garder à l’esprit lors de l’utilisation des appels findAndModify de MongoDB.

  • Si les critères de sélection saisis ne retournent aucun document et si upsert est défini sur true, alors les valeurs spécifiées sont insérées et un nouveau document est créé.
  • Si les critères de sélection saisis ne retournent aucun document lors de l’exécution des opérations de mise à jour ou de suppression, la sortie renvoyée est nulle.
  • Si l’option new est définie sur false et que l’opération de tri n’est pas mentionnée, la sortie renvoyée est nulle.
  • Si l’option new est définie sur false et que l’opération de tri est spécifiée, la sortie est vide.

Exemple de findAndModify de MongoDB

Maintenant, voyons quelques exemples illustrant l’utilisation de l’API findAndModify. Tout d’abord, créons des données de test. Nous allons créer un nouveau document de voiture avec les champs nom, couleur, numéro de voiture (cno), vitesse et pays de fabrication (mfdcountry) via la console mongo.

db.car.insert(
[
{ _id: 1, name: "Alto", color: "Red",cno: "H410",speed:40,mfdcountry: "India"},
{ _id: 2, name: "Polo", color: "White",cno: "H411",speed:45,mfdcountry: "Japan" },
{ _id: 3, name: "Audi", color: "Black",cno: "H412",speed:50,mfdcountry: "Germany" }
]
)

Vérifions maintenant que les données ont été effectivement insérées en utilisant la recherche mongodb :

db.car.find()
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 40, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }

Passons maintenant à l’utilisation réelle de find and modify, en décrivant différentes possibilités. Cas 1: Le document existe dans la base de données

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
  1. Le tri classe les résultats de la requête par ordre croissant. Si plusieurs documents répondent à la condition de la requête, la méthode sélectionnera pour modification le premier document selon cet ordre.
  2. La mise à jour incrémente la valeur du champ vitesse de 10.
  3. La méthode renvoie le document original sélectionné pour cette mise à jour :

Sortie :

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}

Cas 2 : La nouvelle option est définie sur true (renvoie l’ensemble de données mis à jour)

db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})

Sortie :

{
"_id" : ObjectId("546c9f347256eabc40c9da1c"),
"cno" : "H415",
"color" : "Silver",
"name" : "HondaCity",
"speed" : 45
}

Notez que la vitesse est affichée comme étant 45, ce qui est la valeur mise à jour car nous avons défini new sur true. Si cela n’est pas défini, le champ vitesse sera affiché comme étant 20, l’ancienne valeur bien qu’elle soit mise à jour dans la base de données.Cas 3 : L’upsert est défini sur true

db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})

Sortie :

db.car.find();
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 50, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
{ "_id" : ObjectId("546c7c7d6be0faf69ee36546"), "name" : "WagonR", "speed" : 5 }

Le nom de la voiture avec WagonR n’est pas dans la base de données, donc un nouveau document est créé dans la base de données. La méthode renvoie un document vide { } si l’option de tri est spécifiée. Si l’option de tri n’est pas incluse, la méthode renvoie null. En plus de cela, cela peut également être utilisé pour effectuer une opération de tri et de suppression. Si le champ remove est défini sur true, le nom de la voiture correspondant aux critères spécifiés sera supprimé de la base de données.

db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)

Sortie :

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}

Le champ remove est défini sur true, le document avec le nom « Alto » est supprimé de la base de données.

Exemple de code Java findAndModify MongoDB

Les opérations représentées ci-dessus sont toutes effectuées manuellement à l’aide de mongo shell. La même chose peut être faite de manière programmatique en Java comme ci-dessous. Téléchargez le pilote mongo jar et ajoutez-le à votre classpath. Tout d’abord, nous devons établir une connexion au serveur mongodb en utilisant le client Mongo. Le nom de la base de données doit être spécifié pour la connexion en tant que paramètre. Si la base de données n’existe pas, une nouvelle base de données sera créée. Après cela, nous ajouterons quelques enregistrements dans la base de données, effectuerons une opération de findAndModify, puis vérifierons si les enregistrements sont effectivement mis à jour. Le programme ci-dessous fonctionne avec les versions du pilote mongo java 2.x.

package com.journaldev.mongodb;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

public class MongoDBFindAndModify {

	public static void main(String[] args) throws UnknownHostException {
		// Obtenez une nouvelle connexion à la base de données en supposant qu'elle fonctionne.
		MongoClient mongoClient = new MongoClient("localhost");
		// utilisez test comme base de données. Utilisez votre base de données ici.
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		// insérez quelques données de test pour commencer.
		BasicDBObject obj = new BasicDBObject();
		obj.append("name", "Volkswagen");
		obj.append("color", "JetBlue");
		obj.append("cno", "H672");
		obj.append("speed", 62);
		obj.append("mfdcountry", "Italy");
		coll.insert(obj);
		
		// opération findAndModify. Mettre à jour la couleur en bleu pour les voitures ayant une vitesse
		// < 45
		DBObject query = new BasicDBObject("speed",
				new BasicDBObject("$lt", 45));
		DBObject update = new BasicDBObject();
		update.put("$set", new BasicDBObject("color", "Blue"));
		DBCursor cursor = coll.find();
		try {
			while (cursor.hasNext()) {
				System.out.println(cursor.next());
			}
		} finally {
			cursor.close();
		}
		coll.findAndModify(query, update);
	}
}

Sortie :

// Données de test avant l'insertion
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}


// Données de test après l'insertion
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}


/*Test Data Before findandModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0}


/*Test Data After findAndModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0 , "color" : "Blue"}

Si vous utilisez les versions 3.x du pilote MongoDB java, utilisez le programme ci-dessous.

package com.journaldev.mongodb.main;

import java.net.UnknownHostException;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
 
public class MongoDBFindAndModify {
 
    public static void main(String[] args) throws UnknownHostException {
        // Obtenez une nouvelle connexion à la base de données en supposant qu'elle fonctionne.
        MongoClient mongoClient = new MongoClient("localhost");
        
        // utilisez test comme base de données. Utilisez votre base de données ici.
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
        // insérez quelques données de test pour commencer.
        Document obj = new Document();
        obj.append("name", "Volkswagen");
        obj.append("color", "JetBlue");
        obj.append("cno", "H672");
        obj.append("speed", 62);
        obj.append("mfdcountry", "Italy");
        coll.insertOne(obj);
         
        // opération findAndModify. Mettre à jour la couleur en bleu pour les voitures ayant une vitesse > 45
        Bson query = new Document("speed",
                new Document("$gt", 45));
        Bson update = new Document("$set", 
        			new Document("color", "Blue"));
        
        System.out.println("before update");
        findAndPrint(coll);
        
        coll.findOneAndUpdate(query, update);
        
        System.out.println("after update of color field");
        findAndPrint(coll);
        
        mongoClient.close();

    }

	private static void findAndPrint(MongoCollection coll) {
		FindIterable cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}

Ci-dessous l’image montre la sortie du programme ci-dessus, remarquez le changement dans le champ de couleur. C’est tout pour l’exemple de findAndModify de MongoDB, nous examinerons plus d’opérations MongoDB dans les prochains articles. Référence: Documentation officielle de MongoDB

Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example