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

Operaciones Push y Set en la misma actualización de MongoDB

1. Resumen

$empujar es un operador de actualización en MongoDB que agrega el valor en una matriz. Por el contrario, el $conjunto El operador se utiliza para actualizar el valor de un campo existente en el documento.

En este breve tutorial, presentaremos cómo realizar $push y $establecer operaciones juntas en una sola consulta de actualización.

2. Inicialización de la base de datos

Antes de avanzar para realizar las múltiples operaciones de actualización, primero debemos configurar una base de datos baeldung y colección de muestras marcas :

use baeldung;
db.createCollection(marks);

Insertemos algunos documentos en la colección marcas utilizando insertMany método de MongoDB:

db.marks.insertMany([
    {
        "studentId": 1023,
        "studentName":"James Broad",
        "joiningYear":"2018",
        "totalMarks":100,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":40
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    },
    {
        "studentId": 1024,
        "studentName":"Chris Overton",
        "joiningYear":"2018",
        "totalMarks":110,
        "subjectDetails":[
            {
                "subjectId":123,
                "subjectName":"Operating Systems Concepts",
                "marks":50
            },
            {
                "subjectId":124,
                "subjectName":"Numerical Analysis",
                "marks":60
            }
        ]
    }
]);

En una inserción exitosa, la consulta anterior devolverá la siguiente respuesta:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
        ObjectId("622300cc85e943405d04b568")
    ]
}

Hasta ahora, hemos insertado con éxito algunos documentos de muestra en la colección marcas .

3. Comprender el problema

Para entender el problema, primero entendamos el documento que acabamos de insertar. Incluye los datos de los alumnos y las notas obtenidas por ellos en las distintas materias. Las marcas totales  es la suma de las notas que se obtienen en diferentes materias.

Consideremos una situación en la que deseamos agregar un nuevo tema en subjectDetails formación. Para que los datos también sean consistentes, necesitamos actualizar las totalMarks campo también.

En MongoDB, primero, agregaremos el nuevo sujeto a la matriz usando $push operador. Luego estableceremos las totalMarks campo a un valor particular usando el $set operador.

Ambas operaciones se pueden realizar individualmente usando $push y $establecer operador, respectivamente. Pero podemos escribir la consulta MongoDB para realizar ambas operaciones juntas.

4. Uso de la consulta de shell de MongoDB

En MongoDB, podemos actualizar múltiples campos de un documento utilizando los diferentes operadores de actualización. Aquí, usaremos ambos $push y $establecer operadores juntos en un updateOne consulta.

Veamos el ejemplo que contiene ambos $push y $establecer operadores juntos:

db.marks.updateOne(
    {
        "studentId": 1023
    },
    {
        $set: {
            totalMarks: 170
        },
        $push: {
            "subjectDetails":{
                "subjectId": 126,
                "subjectName": "Java Programming",
                "marks": 70
            }
        }
    }
);

Aquí, en la consulta anterior, hemos agregado la consulta de filtro basada en studentId. Una vez que obtenemos el documento filtrado, actualizamos las totalMarks utilizando el operador $set. Además de eso, insertamos los nuevos datos del sujeto en subjectDetails matriz usando $push operador.

Como resultado, la consulta anterior devolverá el siguiente resultado:

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

Aquí, el matchedCount contiene el recuento de documentos que coincidieron con el filtro, mientras que modifiedCount contiene el número de documentos modificados.

5. Código del controlador Java

Hasta ahora, discutimos la consulta de shell mongo para usar $push y $establecer operador juntos. Aquí, aprenderemos a implementar lo mismo usando el código del controlador Java.

Antes de seguir adelante, primero conectémonos a la base de datos y la colección requerida:

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

Aquí, nos estamos conectando a MongoDB, que se ejecuta en el puerto predeterminado 27017 en localhost.

Veamos ahora el código del controlador de Java:

Document subjectData = new Document()
  .append("subjectId", 126)
  .append("subjectName", "Java Programming")
  .append("marks", 70); 
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023), 
  Updates.combine(Updates.set("totalMarks", 170), 
  Updates.push("subjectDetails", subjectData)));

En este fragmento de código, hemos utilizado updateOne método, que actualiza solo un único documento basado en el filtro aplicado studentId 1023. Luego usamos Updates.combine para realizar múltiples operaciones en una sola llamada. El campo totalMarks se actualizará a 170, y un nuevo documento subjectData será empujado al campo de matriz “subjectDetails” .