Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Insertar documentos

En esta guía, puedes aprender cómo insertar documentos en una colección de MongoDB.

Antes de que pueda buscar, actualizar y borrar cualquier documento en MongoDB, debe insertarlos. Puede insertar documentos utilizando los siguientes métodos:

  • insert_one() para insertar un documento

  • insert_many() para insertar uno o más documentos

Esta guía incluye las siguientes secciones:

  • El campo _id describe el campo _id que contiene cada documento

  • Insert a documento describe cómo utilizar el driver para insertar un solo documento en una colección

  • Insertar varios documentos describe cómo usar el controlador para insertar varios documentos en una colección

  • Información adicional proporciona enlaces a recursos y documentación de la API para los tipos y métodos mencionados en esta guía

En una colección de MongoDB, cada documento debe contener un valor único de campo _id. El controlador genera automáticamente un valor único para cada documento como un tipo ObjectId cuando agregas datos a una colección.

Si prefieres establecer valores personalizados, puedes asignar los valores en los campos _id de los documentos pasados a tu operación de inserción.

Importante

Duplicate _id Values

Si intentas insertar documentos que incluyan valores duplicados de _id, estos valores infringen las restricciones del índice único y provocan que la operación de guardar falle.

Para obtener más información sobre el campo _id, consulte Índices únicos en el manual del servidor.

Para obtener más información sobre la estructura y las reglas de los documentos, consulte Documentos en el manual del servidor.

Utilice el método insert_one() para insertar un solo documento en una colección.

Debe insertar un documento del mismo tipo con el que parametrizó su instancia Collection. Por ejemplo, si parametrizaste tu colección con la estructura MyStruct, pasa una instancia MyStruct como parámetro al método insert_one() para insertar un documento. Para obtener más información sobre cómo especificar un parámetro de tipo, consulta la sección Parametrización de colecciones de la guía de Bases de datos y colecciones.

Cuando la inserción tiene éxito, el método devuelve un tipo InsertOneResult que contiene el campo _id del documento insertado recientemente.

El siguiente ejemplo utiliza el método insert_one() para insertar un documento en la colección books:

let my_coll: Collection<Book> = client.database("db").collection("books");
let doc = Book { _id: 8, title: "Atonement".to_string(), author: "Ian McEwan".to_string() };
let insert_one_result = my_coll.insert_one(doc).await?;
println!("Inserted document with _id: {}", insert_one_result.inserted_id);
Inserted document with _id: 8

Tip

Bases de datos y colecciones inexistentes

Si una base de datos y una colección no existen cuando se realiza una operación de guardar en ellas, el servidor las crea automáticamente.

Puede modificar el comportamiento del método insert_one() encadenando métodos del generador de opciones a insert_one(). Estos métodos del generador de opciones establecen los campos de la estructura InsertOneOptions.

Nota

Opciones de configuración

Puedes definir los campos InsertOneOptions encadenando los métodos de creación de opciones directamente a la llamada del método insert_one(). Si usas una versión anterior del driver, debes construir una instancia de InsertOneOptions encadenando los métodos de creación de opciones al método builder(). Luego, pasa tu instancia de opciones como parámetro a insert_one().

La siguiente tabla describe las opciones disponibles en InsertOneOptions:

Opción
Descripción

bypass_document_validation

Si true es, permite que el controlador realice una escritura que infringe la validación a nivel de documento. Para obtener más información sobre la validación, consulte la guía sobre validación de esquemas.

Tipo: bool
Predeterminado: false

write_concern

La preocupación de escritura para la operación. Si no se configura esta opción, la operación hereda la preocupación de escritura establecida para la colección. Para obtener más información sobre las preocupaciones de escritura, consulte "Preocupación de escritura" en el manual del servidor.

Tipo: WriteConcern

comment

Un Bson valor arbitrario vinculado a la operación para rastrearla a través del generador de perfiles de la base de datos, currentOp y los registros. Esta opción solo está disponible al conectarse a las versiones 4.4 y posteriores del servidor MongoDB.

Tipo: Bson
Predeterminado: None

El siguiente código muestra cómo establecer el campo bypass_document_validation mediante el encadenamiento del método bypass_document_validation() al método insert_one():

let _result = my_coll.insert_one(doc)
.bypass_document_validation(true)
.await?;

Este ejemplo inserta un documento en la colección restaurants de la base de datos sample_restaurants. El método insert_one() inserta un documento que tiene valores de campo name, borough y cuisine.

Puedes insertar este documento como una instancia del tipo Document o de un tipo de dato personalizado. Para especificar qué tipo de dato representa los datos de la colección, realiza las siguientes acciones en las líneas resaltadas:

  • Para acceder e insertar documentos en la colección como documentos BSON, reemplaza el parámetro de tipo <T> por <Document> y el marcador de posición <struct or doc> por insert_doc.

  • Para acceder e insertar documentos de colección como instancias de la estructura Restaurant, reemplace el parámetro de tipo <T> por <Restaurant> y el marcador de posición <struct or doc> por insert_struct. La estructura Restaurant se define en la parte superior del archivo de código.

Selecciona la pestaña Asynchronous o Synchronous para ver el código correspondiente para cada runtime:

use std::env;
use mongodb::{
bson::{doc, Document},
Client,
Collection
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
borough: String,
cuisine: String,
name: String,
}
#[tokio::main]
async fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let insert_doc = doc! {
"name": "Sea Stone Tavern",
"cuisine": "Greek",
"borough": "Queens",
};
let insert_struct = Restaurant {
name: "Sea Stone Tavern".to_string(),
cuisine: "Greek".to_string(),
borough: "Queens".to_string(),
};
// Replace <struct or doc> with the insert_struct or insert_doc variable
let res = my_coll.insert_one(<struct or doc>).await?;
println!("Inserted a document with _id: {}", res.inserted_id);
Ok(())
}
Inserted a document with _id: ObjectId("...")
use std::env;
use mongodb::{
bson::{doc, Document},
sync::{ Client, Collection }
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
borough: String,
cuisine: String,
name: String,
}
fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri)?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let insert_doc = doc! {
"name": "Sea Stone Tavern",
"cuisine": "Greek",
"borough": "Queens",
};
let insert_struct = Restaurant {
name: "Sea Stone Tavern".to_string(),
cuisine: "Greek".to_string(),
borough: "Queens".to_string(),
};
// Replace <struct or doc> with the insert_struct or insert_doc variable
let res = my_coll.insert_one(<struct or doc>).run()?;
println!("Inserted a document with _id: {}", res.inserted_id);
Ok(())
}
Inserted a document with _id: ObjectId("...")

Utiliza el método insert_many() para insertar varios documentos en una colección.

Pase un vector que contiene uno o más documentos al método insert_many() para insertarlos en su colección. Estos documentos deben ser instancias del tipo con el que parametrizó su instancia Collection. Por ejemplo, si parametrizó su colección con la estructura MyStruct, pase un vector de instancias MyStruct como parámetro al método insert_many().

Una vez realizada la inserción con éxito, el método retorna un tipo InsertManyResult que hace referencia a los valores _id de los documentos insertados.

El siguiente ejemplo utiliza el método insert_many() para insertar varios documentos en la colección books:

let docs = vec![
Book {
_id: 5,
title: "Cat's Cradle".to_string(),
author: "Kurt Vonnegut Jr.".to_string()
},
Book {
_id: 6,
title: "In Memory of Memory".to_string(),
author: "Maria Stepanova".to_string()
},
Book {
_id: 7,
title: "Pride and Prejudice".to_string(),
author: "Jane Austen".to_string()
}
];
let insert_many_result = my_coll.insert_many(docs).await?;
println!("Inserted documents with _ids:");
for (_key, value) in &insert_many_result.inserted_ids {
println!("{:?}", value);
}
Inserted documents with _ids:
Int32(5)
Int32(6)
Int32(7)

Tip

Bases de datos y colecciones inexistentes

Si una base de datos y una colección no existen cuando se realiza una operación de guardar en ellas, el servidor las crea automáticamente.

Puede modificar el comportamiento del método insert_many() encadenando métodos del generador de opciones a insert_many(). Estos métodos del generador de opciones establecen los campos de la estructura InsertManyOptions.

La siguiente tabla describe las opciones disponibles en InsertManyOptions:

Opción
Descripción

bypass_document_validation

Si true es, permite que el controlador realice una escritura que infringe la validación a nivel de documento. Para obtener más información sobre la validación, consulte la guía sobre validación de esquemas.

Tipo: bool
Predeterminado: false

ordered

Si true, cuando falla cualquier inserción, la operación regresa sin insertar los documentos restantes. Si false, incluso si falla una inserción, la operación continúa con los guardar restantes. Para aprender más sobre las inserciones ordenadas, consulte la sección Ejemplo de comportamiento ordenado de esta guía.

Tipo: bool
Por defecto: true

write_concern

La preocupación de escritura para la operación. Si no se configura esta opción, la operación hereda la preocupación de escritura establecida para la colección. Para obtener más información sobre las preocupaciones de escritura, consulte "Preocupación de escritura" en el manual del servidor.

Tipo: WriteConcern

comment

Un Bson valor arbitrario vinculado a la operación para rastrearla a través del generador de perfiles de la base de datos, currentOp y los registros. Esta opción solo está disponible al conectarse a las versiones 4.4 y posteriores del servidor MongoDB.

Tipo: Bson
Predeterminado: None

El siguiente código muestra cómo establecer el campo comment mediante el encadenamiento del método comment() al método insert_many():

let _result = my_coll.insert_many(docs)
.comment(Some("hello world".into()))
.await?;

Este ejemplo inserta múltiples documentos en la colección restaurants de la base de datos sample_restaurants. El ejemplo inserta documentos que tienen los valores de los campos name y cuisine al pasar un vector de documentos al método insert_many().

Se puede insertar estos documentos como instancias del tipo Document o de un tipo de datos personalizado. Para especificar qué tipo de dato representa los datos de la colección, realiza las siguientes acciones en las líneas resaltadas:

  • Para acceder e insertar documentos en la colección como documentos BSON, reemplaza el parámetro de tipo <T> por <Document> y el marcador de posición <struct or doc> por insert_docs.

  • Para acceder e insertar documentos de colección como instancias de la estructura Restaurant, reemplace el parámetro de tipo <T> por <Restaurant> y el marcador de posición <struct or doc> por insert_structs. La estructura Restaurant se define en la parte superior del archivo de código.

Selecciona la pestaña Asynchronous o Synchronous para ver el código correspondiente para cada runtime:

use mongodb::{
bson::{doc, Document},
Client,
Collection
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: String,
}
#[tokio::main]
async fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let insert_docs = vec! [
doc! {
"name": "While in Kathmandu",
"cuisine": "Nepalese",
},
doc! {
"name": "Cafe Himalaya",
"cuisine": "Nepalese",
}
];
let insert_structs = vec! [
Restaurant {
name: "While in Kathmandu".to_string(),
cuisine: "Nepalese".to_string(),
},
Restaurant {
name: "Cafe Himalaya".to_string(),
cuisine: "Nepalese".to_string(),
}
];
// Replace <structs or docs> with the insert_structs or insert_docs variable
let insert_many_result = my_coll.insert_many(<structs or docs>).await?;
println!("Inserted documents with _ids:");
for (_key, value) in &insert_many_result.inserted_ids {
println!("{}", value);
}
Ok(())
}
Inserted documents with _ids:
ObjectId("...")
ObjectId("...")
use mongodb::{
bson::{doc, Document},
sync::{Client, Collection}
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: String,
}
fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri)?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let insert_docs = vec! [
doc! {
"name": "While in Kathmandu",
"cuisine": "Nepalese",
},
doc! {
"name": "Cafe Himalaya",
"cuisine": "Nepalese",
}
];
let insert_structs = vec! [
Restaurant {
name: "While in Kathmandu".to_string(),
cuisine: "Nepalese".to_string(),
},
Restaurant {
name: "Cafe Himalaya".to_string(),
cuisine: "Nepalese".to_string(),
}
];
// Replace <structs or docs> with the insert_structs or insert_docs variable
let insert_many_result = my_coll.insert_many(<structs or docs>).run()?;
println!("Inserted documents with _ids:");
for (_key, value) in &insert_many_result.inserted_ids {
println!("{}", value);
}
Ok(())
}
Inserted documents with _ids:
ObjectId("...")
ObjectId("...")

Supón que quieres insertar los siguientes documentos en la colección books:

{ "_id": 1, "title": "Where the Wild Things Are" }
{ "_id": 2, "title": "The Very Hungry Caterpillar" }
{ "_id": 1, "title": "Blueberries for Sal" }
{ "_id": 3, "title": "Goodnight Moon" }

Al intentar insertar estos documentos, el resultado depende del valor que se pase al método de creación de la opción ordered():

  • Si se pasa un valor de true (el valor por defecto), el driver lanza un BulkWriteError cuando intenta insertar el documento con el valor duplicado de _id. Sin embargo, el driver sigue introduciendo los documentos antes de que se produzca el error.

  • Si pasas un valor de false, el controlador sigue lanzando una BulkWriteError cuando intenta insertar el documento con el valor _id duplicado, pero inserta todos los demás documentos.

El siguiente código muestra cómo realizar una operación de escritura desordenada para insertar los documentos anteriores:

let docs = vec![
Book { _id: 1, title: "Where the Wild Things Are".to_string(), author: "".to_string() },
Book { _id: 2, title: "The Very Hungry Caterpillar".to_string(), author: "".to_string() },
Book { _id: 1, title: "Blueberries for Sal".to_string(), author: "".to_string() },
Book { _id: 3, title: "Goodnight Moon".to_string(), author: "".to_string() }
];
my_coll.insert_many(docs).ordered(false).await?;

Aunque esta operación da como resultado un BulkWriteError, aún puedes encontrar los documentos que no producen errores en tu colección:

{ "_id": 1, "title": "Where the Wild Things Are" }
{ "_id": 2, "title": "The Very Hungry Caterpillar" }
{ "_id": 3, "title": "Goodnight Moon" }

Para ejemplos ejecutables de las operaciones de inserción, consulte los siguientes ejemplos de uso:

Para obtener más información sobre los métodos y tipos mencionados en esta guía, vea la siguiente documentación de la API: