Actualización masiva de documentos en MongoDB usando Java
- requisitos previos
- Actualización masiva de documentos en MongoDB usando Java
-
Use
updateMany()
para realizar una actualización masiva agregando un nuevo campo a los documentos existentes -
Use
updateMany()
para realizar una actualización masiva del campo existente en varios documentos que coincidan con el filtro -
Use
updateMany()
para realizar actualizaciones masivas en documentos incrustados que coincidan con el filtro -
Utilice la API
bulkWrite()
para actualizar los documentos existentes que coincidan con la consulta de filtro
Este tutorial trata sobre cómo realizar una actualización masiva de documentos en MongoDB utilizando el controlador Java. También aprenderemos cómo actualizar agregando un nuevo campo, cambiando el valor del campo o matriz existente o eliminando documentos.
requisitos previos
Para este tutorial, estamos utilizando las siguientes herramientas que debe seguir.
- Java (estamos usando Java 18.0.1.1)
- Servidor MongoDB (estamos usando MongoDB 5.0.8)
- Editor de código o cualquier IDE de Java (estamos usando Apache NetBeans IDE 13)
- Dependencias del controlador Mongo Java usando Maven o Gradle; lo estamos usando con Maven.
Actualización masiva de documentos en MongoDB usando Java
La actualización masiva es beneficiosa cuando debemos actualizar varios documentos dentro de la base de datos. Ahora, la pregunta es, ¿cómo queremos actualizar los documentos?
¿Queremos actualizar agregando un nuevo campo, actualizando el valor de un campo existente o una matriz, o eliminando documentos? Para aprender todos estos escenarios, creemos una colección e insertemos dos documentos.
Crear colección:
db.createCollection('supervisor');
Insertar primer documento:
db.supervisor.insertOne(
{
"firstname": "Mehvish",
"lastname": "Ashiq",
"gender": "Female",
"contact" : {
"email":"mehvishofficial@gmail.com",
"phone" : [
{
"type" : "official",
"number" : "123456789"
},
{
"type" : "personal",
"number" : "124578369"
},
]
},
"entries" : [
{ "_id" : 1, "itemsperday" : [ 1,3,4,5,6,7 ] },
{ "_id" : 2, "itemperday" : [ 2,3,4,5,2,7 ] },
{ "_id" : 3, "itemperday" : [ 5,0,0,4,0,1 ] }
]
}
);
Insertar segundo documento:
db.supervisor.insertOne(
{
"firstname": "Tahir",
"lastname": "Raza",
"gender": "Male",
"contact" : {
"email":"tahirraza@gmail.com",
"phone" : [
{
"type" : "official",
"number" : "123478789"
},
{
"type" : "personal",
"number" : "122378369"
},
]
},
"entries" : [
{ "_id" : 1, "itemsperday" : [ 4,5,6,7,4,6 ] },
{ "_id" : 2, "itemperday" : [ 2,3,2,7,5,2 ] },
{ "_id" : 3, "itemperday" : [ 5,0,0,1,0,0 ] }
]
}
);
Una vez que haya completado la colección, puede usar db.supervisor.find().pretty();
para ver los documentos insertados. Comenzaremos con soluciones fáciles y avanzaremos hacia otras un poco complicadas pero interesantes.
Use updateMany()
para realizar una actualización masiva agregando un nuevo campo a los documentos existentes
Código de ejemplo:
// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;
// import necessary libraries
import com.mongodb.BasicDBObject;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
// Example_1
public class Example_1 {
// main method
public static void main(String[] args) {
// Replace the connection string with your own connection string
var uri = "mongodb://localhost:27017";
// try block
try (MongoClient mongoClient = MongoClients.create(uri)) {
// print message if connection is successfully established
System.out.println("Connected successfully to server.");
// get the specified database from the MongoDB server
MongoDatabase database = mongoClient.getDatabase("bulkUpdate");
// get the specified collection from the selected database
MongoCollection<Document> collection = database.getCollection("supervisor");
// update documents by adding a new field and its value
collection.updateMany(
new BasicDBObject(), new BasicDBObject("$set", new BasicDBObject("status", "Good")));
// print a new line
System.out.println();
// iterate over all documents of the selected collection
// to print in Java IDE
collection.find().forEach(doc -> {
System.out.println(doc.toBsonDocument());
System.out.println();
}); // end forEach
} // end try block
// print error if unable to execute a command
catch (MongoException error) {
System.err.println("An error occurred while running a command: " + error);
} // end catch block
} // end main method
} // end Example_1
Producción :
{
"_id": {"$oid": "62a866e592fd89ad9c4932ed"},
"firstname": "Mehvish",
"lastname": "Ashiq",
"gender": "Female",
"contact": {
"email": "mehvishofficial@gmail.com",
"phone": [
{ "type": "official", "number": "123456789"},
{"type": "personal", "number": "124578369"}
]
},
"entries": [
{"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
{"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
{"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
],
"status": "Good"
}
{
"_id": {"$oid": "62a8670192fd89ad9c4932ee"},
"firstname": "Tahir",
"lastname": "Raza",
"gender": "Male",
"contact": {
"email": "tahirraza@gmail.com",
"phone": [
{"type": "official", "number": "123478789"},
{"type": "personal", "number": "122378369"}
]
},
"entries": [
{"_id": 1.0, "itemsperday": [4.0, 5.0, 6.0, 7.0, 4.0, 6.0]},
{"_id": 2.0, "itemperday": [2.0, 3.0, 2.0, 7.0, 5.0, 2.0]},
{"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 1.0, 0.0, 0.0]}
],
"status": "Good"
}
Hemos formateado la salida para usted (dado arriba), pero verá un documento por línea en IDE. También podemos usar el db.supervisor.find().pretty();
en mongo shell para ver los documentos actualizados allí.
Para este código de ejemplo, usamos el método updateMany()
de un objeto de colección mongo que toma la consulta filter
y una instrucción update
para actualizar los documentos coincidentes. Aquí, no estamos filtrando los documentos, sino agregando un nuevo campo llamado status
a todos los documentos existentes (consulte el resultado anterior).
Use updateMany()
para realizar una actualización masiva del campo existente en varios documentos que coincidan con el filtro
Código de ejemplo:
// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;
// import necessary libraries
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Updates.combine;
import static com.mongodb.client.model.Updates.set;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
// Example_2
public class Example_2 {
// main method
public static void main(String[] args) {
// Replace the connection string with your own connection string
var uri = "mongodb://localhost:27017";
// try block
try (MongoClient mongoClient = MongoClients.create(uri)) {
// print message if connection is successfully established
System.out.println("Connected successfully to server.");
// get the specified database from the MongoDB server
MongoDatabase database = mongoClient.getDatabase("bulkUpdate");
// get the specified collection from the selected database
MongoCollection<Document> collection = database.getCollection("supervisor");
// update the filtered documents by updating the existing field
collection.updateMany(eq("gender", "Female"), combine(set("gender", "F")));
collection.updateMany(eq("gender", "Male"), combine(set("gender", "M")));
System.out.println();
// iterate over all documents of the selected collection
// to print in Java IDE
collection.find().forEach(doc -> {
System.out.println(doc.toBsonDocument());
System.out.println();
}); // end forEach
} // end try block
// print error if unable to execute a command
catch (MongoException error) {
System.err.println("An error occurred while running a command: " + error);
} // end catch block
} // end main method
} // end Example_2
Producción :
{
"_id": {"$oid": "62a866e592fd89ad9c4932ed"},
"firstname": "Mehvish",
"lastname": "Ashiq",
"gender": "F",
"contact": {
"email": "mehvishofficial@gmail.com",
"phone": [
{ "type": "official", "number": "123456789"},
{"type": "personal", "number": "124578369"}
]
},
"entries": [
{"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
{"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
{"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
],
"status": "Good"
}
{
"_id": {"$oid": "62a8670192fd89ad9c4932ee"},
"firstname": "Tahir",
"lastname": "Raza",
"gender": "M",
"contact": {
"email": "tahirraza@gmail.com",
"phone": [
{"type": "official", "number": "123478789"},
{"type": "personal", "number": "122378369"}
]
},
"entries": [
{"_id": 1.0, "itemsperday": [4.0, 5.0, 6.0, 7.0, 4.0, 6.0]},
{"_id": 2.0, "itemperday": [2.0, 3.0, 2.0, 7.0, 5.0, 2.0]},
{"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 1.0, 0.0, 0.0]}
],
"status": "Good"
}
Este ejemplo de código es similar al anterior, pero estamos actualizando el valor de un campo específico en todos los documentos que coinciden con el filtro.
Estamos utilizando updateMany()
para realizar actualizaciones masivas de todos los documentos en los que gender
es igual a Female
y gender
es igual a Male
. Estamos cambiando "gender": "Female"
y "gender": "Male"
a "gender": "F"
y "gender": "M"
respectivamente.
Hasta ahora, hemos visto cómo usar el método updateMany()
para agregar un nuevo campo o actualizar el valor de un campo existente en el primer nivel. A continuación, aprenderemos a usar updateMany()
para realizar una actualización masiva de documentos incrustados que satisfagan la consulta de filtro.
Use updateMany()
para realizar actualizaciones masivas en documentos incrustados que coincidan con el filtro
Código de ejemplo:
// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;
// import necessary libraries
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import org.bson.Document;
import org.bson.conversions.Bson;
// Example_3
public class Example_3 {
// main method
public static void main(String[] args) {
// Replace the connection string with your own connection string
var uri = "mongodb://localhost:27017";
// try block
try (MongoClient mongoClient = MongoClients.create(uri)) {
// print message if connection is successfully established
System.out.println("Connected successfully to server.");
// get the specified database from the MongoDB server
MongoDatabase database = mongoClient.getDatabase("bulkUpdate");
// get the specified collection from the selected database
MongoCollection<Document> collection = database.getCollection("supervisor");
// filter
Bson where = new Document().append("contact.phone.type", "official");
// update
Bson update = new Document().append("contact.phone.$.type", "assistant");
// set
Bson set = new Document().append("$set", update);
// update collection
collection.updateMany(where, set, new UpdateOptions());
// iterate over all documents of the selected collection
// to print in Java IDE
collection.find().forEach(doc -> {
System.out.println(doc.toBsonDocument());
System.out.println();
}); // end forEach
} // end try block
// print error if unable to execute a command
catch (MongoException error) {
System.err.println("An error occurred while running a command: " + error);
} // end catch block
} // end main method
} // end Example_3
Producción :
{
"_id": {"$oid": "62a866e592fd89ad9c4932ed"},
"firstname": "Mehvish",
"lastname": "Ashiq",
"gender": "F",
"contact": {
"email": "mehvishofficial@gmail.com",
"phone": [
{ "type": "assistant", "number": "123456789"},
{"type": "personal", "number": "124578369"}
]
},
"entries": [
{"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
{"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
{"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
],
"status": "Good"
}
{
"_id": {"$oid": "62a8670192fd89ad9c4932ee"},
"firstname": "Tahir",
"lastname": "Raza",
"gender": "M",
"contact": {
"email": "tahirraza@gmail.com",
"phone": [
{"type": "assistant", "number": "123478789"},
{"type": "personal", "number": "122378369"}
]
},
"entries": [
{"_id": 1.0, "itemsperday": [4.0, 5.0, 6.0, 7.0, 4.0, 6.0]},
{"_id": 2.0, "itemperday": [2.0, 3.0, 2.0, 7.0, 5.0, 2.0]},
{"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 1.0, 0.0, 0.0]}
],
"status": "Good"
}
En este programa Java, usamos el método updateMany()
para realizar una actualización masiva en documentos incrustados que coinciden con la consulta de filtro.
Aquí, actualizamos el valor de contact.phone.type
de oficial
a asistente
. Para acceder a una matriz de documentos, usamos el operador posicional ($
) para actualizar el primer valor de matriz que cumple con la consulta de filtro.
Mientras usamos el operador posicional, también podemos especificar qué elementos de la matriz se supone que deben actualizarse. Podemos especificar los elementos de la matriz primero, todos o particulares para actualizar.
Para especificar los elementos de la matriz a través del operador posicional, usamos la notación de puntos
, una sintaxis de acceso a propiedades para navegar objetos BSON
. Usamos el operador posicional de las siguientes maneras para actualizar primero, todos o elementos de matriz especificados.
-
Usamos el operador posicional (
$
) para actualizar el primer elemento de la matriz que satisface la consulta de filtro, mientras que el campo de la matriz debe ser parte de la consulta de filtro para usar el operador posicional. -
Usamos todos los operadores posicionales (
$[]
) para actualizar todos los elementos (elementos) de una matriz. -
El operador posicional filtrado (
$[<identificador>]
) se utiliza para actualizar aquellos elementos de la matriz que coinciden con la consulta de filtro. Aquí, tenemos que incluir el filtro de matriz en nuestra operación de actualización para indicar qué elementos de la matriz deben actualizarse.Recuerda que el
<identificador>
es un nombre que le damos a nuestro filtro de matriz. Este valor debe comenzar con una letra minúscula y contener solo caracteres alfanuméricos.
Utilice la API bulkWrite()
para actualizar los documentos existentes que coincidan con la consulta de filtro
Código de ejemplo:
// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;
// import necessary libraries
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.DeleteOneModel;
import com.mongodb.client.model.UpdateManyModel;
import com.mongodb.client.model.WriteModel;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
// Example_4
public class Example_4 {
// main method
public static void main(String[] args) {
// Replace the connection string with your own connection string
var uri = "mongodb://localhost:27017";
// try block
try (MongoClient mongoClient = MongoClients.create(uri)) {
// print message if connection is successfully established
System.out.println("Connected successfully to server.");
// get the specified database from the MongoDB server
MongoDatabase database = mongoClient.getDatabase("bulkUpdate");
// get the specified collection from the selected database
MongoCollection<Document> collection = database.getCollection("supervisor");
// create object
List<WriteModel<Document>> writes = new ArrayList<>();
// delete the document matching the filter
writes.add(new DeleteOneModel<>(new Document("firstname", "Tahir")));
// update document matching the filter
writes.add(new UpdateManyModel<>(new Document("status", "Good"), // filter
new Document("$set", new Document("status", "Excellent")) // update
));
// bulk write
collection.bulkWrite(writes);
// iterate over all documents of the selected collection
// to print in Java IDE
collection.find().forEach(doc -> {
System.out.println(doc.toBsonDocument());
System.out.println();
}); // end forEach
} // end try block
catch (MongoException me) {
System.err.println("An error occurred while running a command: " + me);
} // end catch block
} // end main method
} // end Example_4
Producción :
{
"_id": {"$oid": "62a866e592fd89ad9c4932ed"},
"firstname": "Mehvish",
"lastname": "Ashiq",
"gender": "F",
"contact": {
"email": "mehvishofficial@gmail.com",
"phone": [
{"type": "assistant", "number": "123456789"},
{"type": "personal", "number": "124578369"}
]
},
"entries": [
{"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
{"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
{"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
],
"status": "Excellent"
}
En este ejemplo, estamos realizando varias operaciones (eliminar y actualizar) a la vez usando la API bulkWrite()
. El DeleteOneModel()
se usa para eliminar un documento que coincida con el filtro, mientras que estamos utilizando UpdateManyModel()
para actualizar el valor de un campo ya existente en todos aquellos documentos que coincidan con el filtro.