Overview
En esta guía, puedes aprender cómo insertar documentos con el controlador Java de MongoDB.
Puede utilizar MongoDB para recuperar, actualizar y borrar información. Para realizar cualquiera de esas operaciones, esa información, como los perfiles de usuario y los pedidos, debe existir en MongoDB. Para que exista esa información, primero se debe ejecutar una operación de inserción.
Una operación de inserción inserta uno o varios documentos en MongoDB utilizando el insertOne(), insertMany(), y bulkWrite() métodos.
Las siguientes secciones se centran en insertOne() y insertMany(). Para obtener información sobre cómo utilizar el método bulkWrite(), consulta nuestro
guía sobre operaciones en masa.
Nota
El campo id_ en las operaciones de inserción
Al insertar un documento, MongoDB impone una restricción a los documentos de forma predeterminada: cada documento debe contener un valor _id único. Los valores duplicados de _id violan las restricciones del índice único, lo que resulta en un WriteError.
Existen dos maneras de gestionar este campo:
El mismo usuario puede gestionar este campo y asegurarse de que cada valor que use sea único.
Puedes permitir que el controlador genere automáticamente valores únicos de ObjectId.
A menos que hayas proporcionado garantías sólidas de singularidad, recomendamos que dejes que el controlador genere automáticamente valores de _id.
Para obtener más información sobre los índices únicos, consulte la entrada del manual sobre Unique Indexes.
Inserta un solo documento
Utilice el método insertOne() cuando desee insertar un solo documento.
Tras una inserción exitosa, el método devuelve una instancia de InsertOneResult que representa el _id del nuevo documento.
Ejemplo
El siguiente ejemplo crea e inserta un documento utilizando el método insertOne():
Document doc1 = new Document("color", "red").append("qty", 5); InsertOneResult result = collection.insertOne(doc1); System.out.println("Inserted a document with the following id: " + result.getInsertedId().asObjectId().getValue());
El resultado del código anterior se asemeja al siguiente:
Inserted a document with the following id: 60930c39a982931c20ef6cd6
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulta los siguientes recursos:
insertOne() Documentación de la API
InsertOneResult Documentación de la API
Explicación manual sobre insertOne()
Ejemplo ejecutable de documento Insertar un ejemplo de documento
Inserta varios documentos
Utiliza el método insertMany() cuando desees insertar varios documentos. Este método inserta documentos en el orden especificado hasta que ocurra una excepción, si es que hay alguna.
Por ejemplo, suponga que desea insertar los siguientes documentos:
{ "_id": 3, "color": "red", "qty": 5 } { "_id": 4, "color": "purple", "qty": 10 } { "_id": 3, "color": "yellow", "qty": 3 } { "_id": 6, "color": "blue", "qty": 8 }
Si intentas insertar estos documentos, se produce un WriteError en el tercer documento y los documentos anteriores al error se insertan en tu colección.
Tip
Utilice un bloque try-catch para obtener una confirmación de los documentos procesados con éxito antes de que ocurra el error:
List<Integer> insertedIds = new ArrayList<>(); // Inserts sample documents and prints their "_id" values try { InsertManyResult result = collection.insertMany(documents); result.getInsertedIds().values() .forEach(doc -> insertedIds.add(doc.asInt32().getValue())); System.out.println("Inserted documents with the following ids: " + insertedIds); // Prints a message if any exceptions occur during the operation and the "_id" values of inserted documents } catch(MongoBulkWriteException exception) { exception.getWriteResult().getInserts() .forEach(doc -> insertedIds.add(doc.getId().asInt32().getValue())); System.out.println("A MongoBulkWriteException occurred, but there are " + "successfully processed documents with the following ids: " + insertedIds); }
La salida consiste en documentos que MongoDB puede procesar y debería verse como la siguiente:
A MongoBulkWriteException occurred, but there are successfully processed documents with the following ids: [3, 4, 6]
Si miras dentro de tu colección, deberías ver los siguientes documentos:
{ "_id": 3, "color": "red", "qty": 5 } { "_id": 4, "color": "purple", "qty": 10 }
En caso de inserción exitosa, el método devuelve una instancia de InsertManyResult que representa el _id de cada documento nuevo.
Ejemplo
El siguiente ejemplo crea y añade dos documentos a un List, e inserta el List utilizando el método insertMany():
List<Document> documents = new ArrayList<>(); Document doc1 = new Document("color", "red").append("qty", 5); Document doc2 = new Document("color", "purple").append("qty", 10); documents.add(doc1); documents.add(doc2); InsertManyResult result = collection.insertMany(documents); // Retrieves and prints the ID values of each inserted document List<ObjectId> insertedIds = new ArrayList<>(); result.getInsertedIds().values() .forEach(doc -> insertedIds.add(doc.asObjectId().getValue())); System.out.println("Inserted documents with the following ids: " + insertedIds);
El resultado del código anterior se asemeja al siguiente:
Inserted documents with the following ids: [60930c3aa982931c20ef6cd7, 60930c3aa982931c20ef6cd8]
Insertar ejemplo: archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB mediante un URI de conexión. Para obtener más información sobre cómo conectarse a su instancia de MongoDB, consulte la guía Crear un MongoClient. Este ejemplo también utiliza la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Puede cargarlos en su base de datos en el nivel gratuito de MongoDB Atlas siguiendo el MongoDB Comenzar.
El siguiente código es un archivo completo y autónomo que realiza una operación de "insert one" y una operación de "insert many":
// Inserts a sample document describing a movie by using the Java driver package org.example; import java.util.Arrays; import org.bson.Document; import org.bson.types.ObjectId; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.InsertManyResult; import java.util.List; public class Insert { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); // Inserts a sample document describing a movie into the collection InsertOneResult result = collection.insertOne(new Document() .append("_id", new ObjectId()) .append("title", "Ski Bloopers") .append("genres", Arrays.asList("Documentary", "Comedy"))); // Prints the ID of the inserted document System.out.println("Inserted document id - insert one: " + result.getInsertedId()); // Creates two sample documents containing a "title" field List<Document> movieList = Arrays.asList( new Document().append("title", "Short Circuit 3"), new Document().append("title", "The Lego Frozen Movie")); // Inserts sample documents describing movies into the collection InsertManyResult result = collection.insertMany(movieList); // Prints the IDs of the inserted documents System.out.println("Inserted document id - insert many: " + result.getInsertedIds()); } } }
insertOne() document id: BsonObjectId{value=...} insertMany() document ids: {0=BsonObjectId{value=...}, 1=BsonObjectId{value=...}}
Solución de problemas
Excepción de guardar
El controlador lanza una MongoWriteException por cualquier error de escritura que ocurra al realizar operaciones de escritura individuales. Un objeto MongoWriteException tiene un campo error que contiene el objeto WriteError que lo causó.
Considere una colección que tiene una regla de validación de esquema donde el valor del campo quantity debe ser del tipo int. En el siguiente ejemplo, el driver arroja un MongoWriteException si intentas insertar un documento donde el valor de quantity es "three".
Exception in thread "main" com.mongodb.MongoWriteException: Document failed validation at com.mongodb.internal.connection.ProtocolHelper.getWriteException(ProtocolHelper.java:228) ... Caused by: com.mongodb.MongoWriteException: WriteError{code=121, message='Document failed validation', details={ operator: "$jsonSchema", schemaRules: { bsonType: "int", description: "must be an integer" }, offendingDocument: {"name":"Apple","quantity":"three"} } } at com.mongodb.internal.connection.WriteResultHelper.createWriteException(WriteResultHelper.java:50)
Para obtener más información sobre la validación de esquemas, consulte Validación de esquemas en la sección de Entradas del manual del servidor.
Información Adicional
Documentación de la API
Para obtener más información sobre los métodos y clases utilizados para insertar documentos, consulta la siguiente documentación de la API:
Para obtener more información sobre los tipos de errores comentados en la sección Resolución de problemas, consulte la siguiente documentación de la API: