sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualizar múltiples campos en un documento MongoDB

1. Resumen

MongoDB es una base de datos NoSQL orientada a documentos que está disponible públicamente. Podemos actualizar los documentos en una colección usando varios métodos como actualizar , reemplazar y guardar . Para cambiar un campo específico del documento, usaremos diferentes operadores como $set , $inc, etc.

En este tutorial, aprenderemos a modificar los múltiples campos de un documento usando la actualización y el reemplazar consulta. Para fines de demostración, primero discutiremos la consulta de shell mongo y luego su implementación correspondiente en Java.

Veamos ahora los diversos métodos para lograr el propósito.

2. Consulta de shell para actualizar diferentes campos

Antes de comenzar, primero creemos una nueva base de datos, baeldung y una colección de muestras, empleado . Usaremos esta colección en todos los ejemplos:

use baeldung;
db.createCollection(employee);

Agreguemos ahora algunos documentos a esta colección usando insertMany consulta:

db.employee.insertMany([
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Representative",
        "department_id": 2,
        "salary": 20000,
        "hire_date": NumberLong("1643969311817")
    },
    {
        "employee_id": 794876,
        "employee_name": "Joe Butler",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1645338658000")
    }
]);

Como resultado, obtendremos un JSON con ObjectId para ambos documentos como se muestra a continuación:

{
    "acknowledged": true,
    "insertedIds": [
        ObjectId("6211e034b76b996845f3193d"),
        ObjectId("6211e034b76b996845f3193e")
        ]
}

Hasta ahora, hemos configurado el entorno requerido. Actualicemos ahora los documentos que acabamos de insertar.

2.1. Actualizar múltiples campos de un solo documento

Podemos usar $set y $inc operadores para actualizar cualquier campo en MongoDB. El $conjunto el operador establecerá el valor recién especificado mientras que $inc el operador aumentará el valor en un valor especificado.

Primero veamos la consulta de MongoDB para actualizar dos campos de la colección de empleados usando el $set operador:

db.employee.updateOne(
    {
        "employee_id": 794875,
        "employee_name": "David Smith"
    },
    {
        $set:{
            department_id:3,
            job:"Sales Manager"
        }
    }
);

En la consulta anterior, el employee_id y nombre_empleado El campo se usa para filtrar el documento y el $set El operador se utiliza para actualizar el trabajo y departamento_id campos.

También podemos usar el $set y $inc operadores juntos en una sola consulta de actualización:

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

Esto actualizará el trabajo campo a Gerente de ventas y aumente el department_id por 1.

2.2. Actualizar varios campos de varios documentos

Además, también podemos actualizar múltiples campos de más de un documento en MongoDB. Simplemente necesitamos incluir la opción multi:true para modificar todos los documentos que coincidan con los criterios de consulta del filtro:

db.employee.update(
    {
        "job": "Sales Representative"
    },
    {
        $inc: { 
            salary: 10000
        }, 
        $set: { 
            department_id: 5
        }
    },
    {
        multi: true 
    }
);

Alternativamente, obtendremos los mismos resultados usando updateMany consulta:

db.employee.updateMany(
    {
        "job": "Sales Representative"
    },
    {
        $inc: {
            salary: 10000
        },
        $set: {
            department_id: 5
        }
    }
);

En la consulta anterior, usamos updateMany método para actualizar más de 1 documento de la colección.

2.3. Problema común al actualizar varios campos

Hasta ahora, hemos aprendido a actualizar varios campos usando la consulta de actualización proporcionando dos operadores diferentes o usando un solo operador en varios campos.

Ahora, si usamos un operador varias veces con diferentes campos en una sola consulta, MongoDB solo actualizará la última declaración de la consulta de actualización e ignora el resto:

db.employee.updateMany(
    {
        "employee_id": 794875
    },
    {
        $set: {
            department_id: 3
        },
        $set: {
            job:"Sales Manager"
        }
    }
);

La consulta anterior devolverá un resultado similar a este:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

En este caso, el único trabajo se actualizará a "Gerente de ventas". El id_departamento el valor no se actualizará a 3.

3. Actualizar campos con controlador Java

Hasta ahora, hemos discutido las consultas sin procesar de MongoDB. Ahora realicemos las mismas operaciones usando Java. El controlador MongoDB Java admite dos clases para representar un documento MongoDB, com.mongodb.BasicDBObject y org.bson.Documento. Veremos ambos métodos para actualizar campos en un documento.

Antes de continuar, conectemos primero con el empleado colección dentro del baeldung DB:

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");

Aquí asumimos que MongoDB se ejecuta localmente en el puerto predeterminado de 27017.

3.1. Uso de DBObject

Para crear el documento en MongoDB, usaremos com.mongodb. Interfaz DBObject y su clase de implementación com.mongodb.BasicDBObject .

La implementación del DBObject se basa en pares clave-valor. El BasicDBObject se hereda de LinkedHashMap clase que está en el util paquete.

Ahora usemos el com.mongodb.BasicDBObject para realizar la operación de actualización en múltiples campos:

BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);

Aquí, primero, creamos una consulta de filtro sobre la base del employee_id. Esta operación devolverá un conjunto de documentos. Además, hemos actualizado el valor de department_id y trabajo de acuerdo con la consulta establecida.

3.2. Usando bson Documento

Podemos realizar todas las operaciones de MongoDB utilizando el bson documento. Para eso, primero, necesitamos el objeto de colección y luego realizar la operación de actualización usando updateMany método con el filtro y establecer funciones.

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

Aquí, estamos pasando un filtro de consulta a updateMany método. El equivalente el filtro coincide con employee_id con el texto coincidente exacto '794875'. Luego, actualizamos el department_id y el trabajo utilizando el conjunto operador.

4. Usando Reemplazar Consulta

El enfoque ingenuo para actualizar los múltiples campos de un documento es reemplazarlo con un nuevo documento que tenga valores actualizados.

Por ejemplo, si deseamos reemplazar un documento con employee_id 794875, podemos ejecutar la siguiente consulta:

db.employee.replaceOne(
    {
        "employee_id": 794875
    },
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1643969311817")
    }
);

El comando anterior imprimirá un reconocimiento JSON en la salida:

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

Aquí, el employee_id El campo se utiliza para filtrar el documento. El segundo argumento de la consulta de actualización indica el documento desde el cual se reemplazará el documento existente.

En la consulta anterior, estamos realizando replaceOne , por lo tanto, reemplazará solo un documento con ese filtro. Alternativamente, si queremos reemplazar todos los documentos con esa consulta de filtro, entonces necesitaríamos usar updateMany método.