Puedes realizar operaciones de guardar para insertar nuevos documentos, actualizar documentos existentes, reemplazar un documento existente o borrar documentos existentes de una colección.
Requisitos previos
Debe configurar los siguientes componentes para ejecutar los ejemplos de código de esta guía:
A
test.restaurantsColección rellenada con documentos delrestaurants.jsonarchivo 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.
Conectarse a una implementación de MongoDB
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.
Insertar un documento
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.
Inserta varios documentos
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.
Actualizar documentos existentes
Para actualizar documentos existentes en una colección, puede utilizar los métodos updateOne() o updateMany() de la colección.
Filtros
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.
Operadores de actualización
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.
Actualiza un solo 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 campostarsen1y el valor del campocontact.phoneen"228-555-9999"Updates.currentDate()Para modificar el campolastModifieda la fecha actual. Si el campolastModifiedno existe, el operador lo añade al documento.
Actualiza varios documentos
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 campostarsen0Updates.currentDate()Para establecer el campolastModifiedcon la fecha actual. Si el campolastModifiedno existe, el operador lo añade al documento.
Update Options
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>());
Reemplazar un documento existente
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.
Filtros
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.
Reemplazar un documento
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>());
Update Options
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>());
Delete Documents
Para eliminar documentos de una colección, puede utilizar los métodos deleteOne() y deleteMany().
Filtros
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.
Borrar un único documento
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>());
Borra varios documentos
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>());
Nivel de confirmación de escritura
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
MongoClientde 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
MongoDatabaseutilizando el métodowithWriteConcern():MongoDatabase database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY); En un
MongoCollectionutilizando el métodowithWriteConcern():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);