Docs Menu
Docs Home
/ /
Tutorials
/ / /

Operaciones de escritura

Puedes realizar operaciones de guardar para insertar nuevos documentos, actualizar documentos existentes, reemplazar un documento existente o borrar documentos existentes de una colección.

Debe configurar los siguientes componentes para ejecutar los ejemplos de código de esta guía:

  • A test.restaurants Colección rellenada con documentos del restaurants.json archivo en los activos de documentación de GitHub.

  • Las siguientes declaraciones de importación:

import com.mongodb.*;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Updates.*;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.result.*;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;

Importante

Esta guía utiliza las implementaciones Subscriber, que se describen en la Manual de inicio rápido.

Primero, conéctese a una implementación de MongoDB, luego declare y defina las instancias MongoDatabase y MongoCollection.

El siguiente código se conecta a una implementación independiente de MongoDB que se ejecuta en localhost, en el puerto 27017. Luego, define la variable database para referirse a la base de datos test y la variable collection para referirse a la colección restaurants:

MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("restaurants");

Para obtener más información sobre cómo conectarse a implementaciones de MongoDB, consulte el tutorial Conectarse a MongoDB.

Para insertar un solo documento en la colección, puede utilizar el método insertOne() de la colección:

Document document = new Document("name", "Café Con Leche")
.append("contact", new Document("phone", "228-555-0149")
.append("email", "cafeconleche@example.com")
.append("location",Arrays.asList(-73.92502, 40.8279556)))
.append("stars", 3)
.append("categories", Arrays.asList("Bakery", "Coffee", "Pastries"));
collection.insertOne(document).subscribe(new ObservableSubscriber<Void>());

Nota

Si no se especifica ningún campo id de nivel superior en el documento, MongoDB genera automáticamente un valor y añade este campo al documento insertado.

Para insertar varios documentos, puede utilizar el método insertMany() de la colección, que toma una lista de documentos para insertar como parámetro.

El siguiente ejemplo inserta dos documentos en la colección:

Document doc1 = new Document("name", "Amarcord Pizzeria")
.append("contact", new Document("phone", "264-555-0193")
.append("email", "amarcord.pizzeria@example.net")
.append("location",Arrays.asList(-73.88502, 40.749556)))
.append("stars", 2)
.append("categories", Arrays.asList("Pizzeria", "Italian", "Pasta"));
Document doc2 = new Document("name", "Blue Coffee Bar")
.append("contact", new Document("phone", "604-555-0102")
.append("email", "bluecoffeebar@example.com")
.append("location",Arrays.asList(-73.97902, 40.8479556)))
.append("stars", 5)
.append("categories", Arrays.asList("Coffee", "Pastries"));
List<Document> documents = new ArrayList<Document>();
documents.add(doc1);
documents.add(doc2);
collection.insertMany(documents).subscribe(new ObservableSubscriber<Void>());;

Nota

Si no se especifica ningún campo id de nivel superior en el documento, MongoDB genera automáticamente un valor y añade este campo al documento insertado.

Para actualizar documentos existentes en una colección, puede utilizar los métodos updateOne() o updateMany() de la colección.

Puede pasar un documento de filtro a los métodos para especificar qué documentos actualizar. La especificación del documento de filtro es la misma que para las operaciones de lectura. Para facilitar la creación de objetos de filtro, el controlador proporciona la clase auxiliar Filters.

Para especificar un filtro vacío y hacer coincidir todos los documentos de una colección, utilice un objeto Document vacío como filtro.

Para cambiar un campo en un documento, MongoDB proporciona operadores de actualización. Para especificar la modificación que se debe realizar utilizando los operadores de actualización, cree un documento de actualización. Para obtener más información sobre los operadores de actualización, consulte Operadores de actualización en el Manual del servidor.

Para facilitar la creación de documentos de actualización, el controlador proporciona la clase auxiliar Updates.

Importante

El campo id es inmutable, por lo que no puede cambiar el valor del campo id en un documento.

El método updateOne() actualiza un solo documento, incluso si la condición de filtro coincide con varios documentos de la colección.

La siguiente operación en la colección restaurants actualiza un documento en el que el valor del campo id es ObjectId("57506d62f57802807471dd41"):

collection.updateOne(
eq("_id", new ObjectId("57506d62f57802807471dd41")),
combine(set("stars", 1), set("contact.phone", "228-555-9999"), currentDate("lastModified"))
).subscribe(new ObservableSubscriber<UpdateResult>());

Específicamente, la operación utiliza los siguientes métodos:

  • Updates.set() para establecer el valor del campo stars en 1 y el valor del campo contact.phone en "228-555-9999"

  • Updates.currentDate() Para modificar el campo lastModified a la fecha actual. Si el campo lastModified no existe, el operador lo añade al documento.

El método updateMany() actualiza todos los documentos que coinciden con la condición de filtro.

La siguiente operación en la colección restaurants actualiza todos los documentos en los que el valor del campo stars es 2:

collection.updateMany(
eq("stars", 2),
combine(set("stars", 0), currentDate("lastModified"))
).subscribe(new ObservableSubscriber<UpdateResult>());

Específicamente, la operación utiliza los siguientes métodos:

  • Updates.set() para establecer el valor del campo stars en 0

  • Updates.currentDate() Para establecer el campo lastModified con la fecha actual. Si el campo lastModified no existe, el operador lo añade al documento.

Al usar los métodos updateOne() y updateMany(), puedes incluir un documento UpdateOptions para especificar la opción upsert o la opción bypassDocumentationValidation:

collection.updateOne(
eq("_id", 1),
combine(set("name", "Fresh Breads and Tulips"), currentDate("lastModified")),
new UpdateOptions().upsert(true).bypassDocumentValidation(true)
).subscribe(new ObservableSubscriber<UpdateResult>());

Para reemplazar un documento existente en una colección, puede utilizar el método replaceOne() de la colección.

Importante

El campo id es inmutable, por lo que no puede reemplazar el campo id en un documento.

Puede pasar un documento de filtro al método replaceOne() para especificar qué documento reemplazar. La especificación del documento de filtro es la misma que para las operaciones de lectura. Para facilitar la creación de objetos de filtro, el controlador proporciona la clase auxiliar Filters.

Para especificar un filtro vacío y hacer coincidir todos los documentos de una colección, utilice un objeto Document vacío como filtro.

El método replaceOne() reemplaza como máximo un solo documento, incluso si la condición del filtro coincide con varios documentos de la colección.

Para reemplazar un documento, pasa un nuevo documento al método replaceOne().

Importante

El documento de reemplazo puede tener campos diferentes a los del documento original. En el documento de reemplazo, puede omitir el campo id, ya que el campo id es inmutable. Sin embargo, si incluye el campo id, no puede especificar un valor diferente para el campo id.

La siguiente operación en la colección restaurants reemplaza el documento en el que el valor del campo id es ObjectId("57506d62f57802807471dd41"):

collection.replaceOne(
eq("_id", new ObjectId("57506d62f57802807471dd41")),
new Document("name", "Green Salads Buffet")
.append("contact", "TBD")
.append("categories", Arrays.asList("Salads", "Health Foods", "Buffet"))
).subscribe(new ObservableSubscriber<UpdateResult>());

Al utilizar el método replaceOne(), puede incluir un documento UpdateOptions para especificar la opción upsert o la opción bypassDocumentationValidation:

collection.replaceOne(
eq("name", "Orange Patisserie and Gelateria"),
new Document("stars", 5)
.append("contact", "TBD")
.append("categories", Arrays.asList("Cafe", "Pastries", "Ice Cream")),
new UpdateOptions().upsert(true).bypassDocumentValidation(true)
).subscribe(new ObservableSubscriber<UpdateResult>());

Para eliminar documentos de una colección, puede utilizar los métodos deleteOne() y deleteMany().

Puede pasar un documento de filtro a los métodos para especificar qué documentos eliminar. La especificación del documento de filtro es la misma que para las operaciones de lectura. Para facilitar la creación de objetos de filtro, el controlador proporciona la clase auxiliar Filters.

Para especificar un filtro vacío y hacer coincidir todos los documentos de una colección, utilice un objeto Document vacío como filtro.

El método deleteOne() elimina como máximo un solo documento, incluso si la condición del filtro coincide con varios documentos de la colección.

La siguiente operación en la colección restaurants elimina un documento en el que el valor del campo _id es ObjectId("57506d62f57802807471dd41"):

collection
.deleteOne(eq("_id", new ObjectId("57506d62f57802807471dd41")))
.subscribe(new ObservableSubscriber<DeleteResult>());

El método deleteMany() elimina todos los documentos que coinciden con la condición de filtro.

La siguiente operación en la colección restaurants elimina todos los documentos en los que el valor del campo stars es 4:

collection
.deleteMany(eq("stars", 4))
.subscribe(new ObservableSubscriber<DeleteResult>());

La preocupación de escritura describe el nivel de reconocimiento solicitado a MongoDB para las operaciones de escritura.

Puede configurar una preocupación de escritura en los siguientes niveles:

  • De una forma MongoClient de las siguientes maneras:

    • Al crear una instancia MongoClientSettings:

      MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder()
      .applyConnectionString(new ConnectionString("mongodb://host1,host2"))
      .writeConcern(WriteConcern.MAJORITY)
      .build());
    • Al crear una instancia ConnectionString:

      MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?w=majority");
  • En un MongoDatabase utilizando el método withWriteConcern():

    MongoDatabase database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY);
  • En un MongoCollection utilizando el método withWriteConcern():

    MongoCollection<Document> collection = database
    .getCollection("restaurants")
    .withWriteConcern(WriteConcern.MAJORITY);

MongoDatabase Las instancias MongoCollection y withWriteConcern() son inmutables. Llamar a en una instancia MongoDatabase o MongoCollection existente devuelve una nueva instancia y no afecta a la instancia en la que se llama el método.

En el siguiente ejemplo, la instancia collWithWriteConcern tiene la preocupación de escritura de majority mientras que la preferencia de lectura de collection no se ve afectada:

MongoCollection<Document> collWithWriteConcern = collection
.withWriteConcern(WriteConcern.MAJORITY);

Puede crear instancias MongoClientSettings, MongoDatabase o MongoCollection para incluir combinaciones de inquietudes de lectura, preferencias de lectura e inquietudes de escritura.

Por ejemplo, el siguiente código establece los tres en el nivel de colección:

Collection = database.getCollection("restaurants")
.withReadPreference(ReadPreference.primary())
.withReadConcern(ReadConcern.MAJORITY)
.withWriteConcern(WriteConcern.MAJORITY);

Volver

Cifrado del lado del cliente