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

Actualizar documentos en MongoDB

1. Resumen

MongoDB es una base de datos NoSQL multiplataforma, orientada a documentos y de código abierto, escrita en C++. Además, MongoDB proporciona alto rendimiento, alta disponibilidad y escalado automático.

Para actualizar los documentos en MongoDB, podemos usar diferentes métodos como updateOne , buscarUnoYActualizar, etc. Además, MongoDB proporciona varios operadores para los métodos de actualización.

En este tutorial, analizaremos diferentes enfoques para realizar operaciones de actualización en MongoDB. Para cada enfoque, primero discutiremos la consulta de mongo Shell y luego su implementación en Java.

2. Configuración de la base de datos

Antes de pasar a las consultas de actualización, primero creemos una base de datos, baeldung y una colección de muestra, estudiante:

use baeldung;
db.createCollection(student);

Como ilustración, agreguemos algunos documentos a la colección estudiante utilizando insertMany consulta:

db.student.insertMany([
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 1",
        "age": 16,
        "roll_no":199406
    },
    {
        "student_id": 8765,
        "student_name": "Andrew Boult",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199408
    }
]);

En una inserción exitosa, obtendremos un JSON con acknowledged:true :

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("621b078485e943405d04b557"),
	ObjectId("621b078485e943405d04b558")
    ]
}

Profundicemos ahora en las diferentes formas de actualizar los documentos en MongoDB.

3. Uso de updateOne Método

Se puede realizar una operación de actualización en MongoDB agregando un nuevo campo, eliminando un campo o actualizando un campo existente. El updateOne  El método actualiza un solo documento en una colección según el filtro de consulta aplicado. Primero encuentra el documento que coincide con el filtro y luego actualiza los campos especificados.

Además, podemos usar diferentes operadores como $set , $desestablecido , $inc , etc., con el método de actualización.

Para demostrarlo, veamos la consulta para actualizar un solo documento de una colección:

db.student.updateOne(
    { 
        "student_name" : "Paul Starc"
    },
    { 
        $set: {
            "address" : "Hostel 2"
        }
    }
 );

Obtendremos un resultado similar al que se muestra a continuación:

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

Veamos ahora el código del controlador Java del updateOne anterior. consulta:

UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
Updates.set("address", "Hostel 2"));

Aquí, en primer lugar, hemos utilizado el student_name campo para filtrar los documentos. Luego actualizamos la dirección del documento con student_name “Paul Starc”.

4. Uso de updateMany Método

El actualizarmuchos El método actualiza todos los documentos en las colecciones de MongoDB que coinciden con el filtro dado. Uno de los beneficios de usar updateMany es que podemos actualizar varios documentos sin perder los campos de documentos antiguos.

Veamos la consulta de shell de MongoDB usando updateMany método:

db.student.updateMany(
    { 
        age: { 
            $lt: 20
         } 
    },
    { 
        $set:{ 
            "Review" : true 
        }
    }
);

El comando anterior devolverá el siguiente resultado:

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

Aquí, matchedCount contiene el número de documentos coincidentes, mientras que modifiedCount contiene el número de documentos modificados.

Ahora veamos el código del controlador de Java usando updateMany método:

UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));

Aquí, todos los documentos con edad se filtrarán menos de 20 y la Revisión el campo se establecerá en verdadero .

5. Uso de replaceOne Método

El reemplazar uno El método de MongoDB reemplaza todo el documento. Uno de los inconvenientes del replaceOne es que todos los campos antiguos serán reemplazados por los nuevos campos, y los campos antiguos también se perderán:

db.student.replaceOne(
    { 
        "student_id": 8764
    },
    {
        "student_id": 8764,
        "student_name": "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406
    }
);

En este caso, obtendremos el siguiente resultado:

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

Si no se encuentran coincidencias, la operación devuelve el matchedCount como 0:

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

Escribamos el código del controlador Java correspondiente usando replaceOne método:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age",18)
  .append("roll_no", 199406);
UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);

En el código anterior, hemos creado un documento por el cual se reemplazará el documento anterior. El documento con student_id 8764 será reemplazado con el documento recién creado.

6. Uso de findOneAndReplace Método

El buscarUnoYReemplazar El método es uno de los métodos de actualización avanzados proporcionados por MongoDB y reemplaza el primer documento coincidente según los criterios de selección dados. De forma predeterminada, este método devuelve el documento original. Podemos usar diferentes opciones del findOneAndReplace para ordenar y proyectar documentos si es necesario.

En resumen, findOneAndReplace reemplaza el primer documento coincidente de la colección sobre la base del filtro aplicado:

db.student.findOneAndReplace(
    { 
        "student_id" : { 
            $eq : 8764 
        }
    },
    { 
        "student_id" : 8764,
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    {
        returnNewDocument: false
    }
);

Esta consulta devolverá el siguiente documento:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 1",
    "age":16,
    "roll_no":199406
}

Si configuramos returnNewDocumentverdadero , la operación devolvería el documento reemplazado:

{
    "student_id":8764,
    "student_name":"Paul Starc",
    "address":"Hostel 2",
    "age":18,
    "roll_no":199406
}

Ahora usemos findOneAndReplace método para proyectar el student_id y edad campos en el documento devuelto:

db.student.findOneAndReplace(
    { 
        "student_id" : {
        $eq : 8764 
        } 
    },
    { 
        "student_id" : 8764, 
        "student_name" : "Paul Starc",
        "address": "Hostel 2",
        "age": 18,
        "roll_no":199406 
    },
    { 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "age" : 1 
        } 
    }
);

El resultado de la consulta anterior solo contendrá los campos proyectados:

{
    "student_id":"8764",
    "age":16
}

El código del controlador Java de la consulta anterior con varias opciones de findOneAndReplace:

Document replaceDocument = new Document();
replaceDocument
  .append("student_id", 8764)
  .append("student_name", "Paul Starc")
  .append("address", "Hostel 2")
  .append("age", 18)
  .append("roll_no", 199406);
Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndReplace(
  Filters.eq("student_id", 8764), 
  replaceDocument,
  new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));

En la consulta anterior, findOneAndReplace primero ordenará los documentos en orden ascendente según roll_no, y el documento recién creado reemplaza el documento con student_id “8764”.

7. Uso de findOneAndUpdate Método

El findOneAndUpdate El método actualiza el primer documento coincidente de la colección. Si más de un documento coincide con los criterios de selección, solo se actualiza el primer documento coincidente. Cuando actualizamos el documento, el valor de _id el campo permanece sin cambios:

db.student.findOneAndUpdate(
    { 
        "student_id" : 8764
    },
    { 
        $inc : { 
            "roll_no" : 5
        } 
    },
    { 
        sort: { 
            "roll_no" : 1 
        }, 
        projection: { 
            "_id" : 0,
            "student_id":1,
            "address" : 1
        }
    }
);

El resultado de la consulta solo contendrá el studentId y dirección del documento anterior:

{
    "student_id":8764,
    "address":"Hostel 1"
}

El código del controlador Java de la consulta anterior, usando diferentes opciones de findOneAndUpdate es el siguiente:

Document sort = new Document("roll_no", 1);
Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
Document resultDocument = collection.findOneAndUpdate(
  Filters.eq("student_id", 8764),
  Updates.inc("roll_no", 5), 
  new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));

En este caso, el findOneAndUpdate primero ordenará el documento en orden ascendente según roll_no . La consulta anterior incrementa el roll_no  por 5 y luego devuelve el student_id y dirección campos.