Ejemplo de MongoDB findAndModify()

MongoDB findAndModify() método modifica y devuelve un solo documento basado en los criterios de selección ingresados. El documento devuelto no muestra el contenido actualizado por defecto. Si no existen registros que coincidan con los criterios en la base de datos, se insertará un nuevo registro si la opción upsert está establecida en true.

MongoDB findAndModify()

La sintaxis para el método findAndModify de MongoDB es la siguiente.

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

La descripción de los parámetros es la siguiente. query: Define los criterios de selección para qué registro necesita modificación. sort: Determina qué documento debe modificarse cuando los criterios de selección recuperan varios documentos. new: indica que se mostrará el documento modificado. fields: especifica el conjunto de campos a devolver. upsert: crea un nuevo documento si los criterios de selección no logran recuperar un documento.

Puntos importantes de MongoDB findAndModify

Algunas cosas a tener en cuenta al usar las llamadas findAndModify de MongoDB son:

  • Si los criterios de selección ingresados no obtienen ningún documento y si upsert está configurado en verdadero, entonces se insertan los valores especificados y se crea un nuevo documento.
  • Si los criterios de selección ingresados no obtienen ningún documento mientras se realizan operaciones de actualización o eliminación, la salida devuelta es nula.
  • Si la opción new se establece en falso y no se menciona ninguna operación de ordenamiento, la salida devuelta es nula.
  • Si la opción new se establece en falso y se especifica una operación de ordenamiento, la salida está vacía.

Ejemplo de findAndModify en MongoDB

Ahora veamos algunos ejemplos que demuestran el uso de la API findAndModify. Primero, creemos algunos datos de prueba para comenzar. Crearemos un nuevo documento de automóvil con los campos nombre, color, número de automóvil (cno), velocidad y país de fabricación (mfdcountry) a través de la consola de 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" }
]
)

Ahora verifiquemos que los datos realmente se hayan insertado usando mongodb find:

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" }

Pasando al uso real de find and modify, representamos diferentes posibilidades. Caso 1: El documento existe en la base de datos

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
  1. La consulta encuentra un documento en la colección de automóviles donde el campo de nombre tiene el valor Alto.
  2. La orden de clasificación ordena los resultados de la consulta en orden ascendente. Si varios documentos cumplen la condición de la consulta, el método seleccionará para modificar el primer documento según el orden de esta clasificación.
  3. La actualización incrementa el valor del campo de velocidad en 10.
  4. El método devuelve el documento original seleccionado para esta actualización:

Salida:

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

Caso 2: La nueva opción se establece en true (devuelve el conjunto de datos actualizado)

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

Salida:

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

Tenga en cuenta que la velocidad se muestra como 45, que es el valor actualizado ya que establecimos new en true. Si esto no se establece, el campo de velocidad se mostrará como 20, el valor antiguo aunque se actualice en la base de datos. Caso 3: upsert se establece en true

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

Salida:

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 }

El nombre del coche con WagonR no está en la base de datos, por lo tanto, se crea un nuevo documento en la base de datos. El método devuelve un documento vacío { } si se especifica la opción de clasificación. Si no se incluye la opción de clasificación, el método devuelve null. Aparte de esto, también se puede utilizar para realizar una operación de clasificación y eliminación. Si el campo de eliminación se establece en true, se eliminará el nombre del coche con los criterios especificados de la base de datos.

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

Salida:

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

El campo de eliminación se establece en true, se elimina el documento con el nombre “Alto” de la base de datos.

Ejemplo de Java de búsqueda y modificación de MongoDB

Las operaciones representadas anteriormente se realizan manualmente utilizando la consola de Mongo. Lo mismo se puede hacer programáticamente en Java de la siguiente manera. Descarga el archivo JAR del controlador de Mongo y agrégalo a tu classpath. Primero, necesitamos establecer una conexión con el servidor de MongoDB utilizando el cliente Mongo. El nombre de la base de datos debe especificarse como un parámetro para la conexión. Si la base de datos no existe, se creará una nueva. Después de esto, agregaremos algunos registros a la base de datos, realizaremos una operación de findAndModify y luego verificaremos si los registros se actualizaron realmente. El programa a continuación funciona con las versiones 2.x del controlador de Mongo para Java.

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 {
		// Obtén una nueva conexión a la base de datos asumiendo que está en ejecución.
		MongoClient mongoClient = new MongoClient("localhost");
		// Utiliza "test" como la base de datos. Utiliza tu base de datos aquí.
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		// Inserta algunos datos de prueba para empezar.
		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);
		
		// Operación findAndModify. Actualiza el color a azul para los autos con velocidad
		// < 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);
	}
}

Salida:

// Datos de prueba antes de la inserción
{ "_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"}


// Datos de prueba después de la inserción
{ "_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 estás utilizando las versiones 3.x del controlador de Mongo para Java, entonces utiliza el siguiente programa.

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 {
        // Obtén una nueva conexión a la base de datos asumiendo que está en ejecución.
        MongoClient mongoClient = new MongoClient("localhost");
        
        // Utiliza "test" como la base de datos. Utiliza tu base de datos aquí.
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
        // Inserta algunos datos de prueba para empezar.
        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);
         
        // Operación findAndModify. Actualiza el color a azul para los autos con velocidad > 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);
	}
}

A continuación se muestra la salida del programa anterior, observe el cambio en el campo de color. Eso es todo por el ejemplo de findAndModify de MongoDB, veremos más operaciones de MongoDB en las próximas publicaciones. Referencia: Documentación Oficial de MongoDB

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