Docs Menu
Docs Home
/ /

GridFS

En esta guía, aprenderá a almacenar y recuperar archivos grandes en MongoDB utilizando la especificación GridFS. GridFS divide los archivos grandes en fragmentos y almacena cada fragmento como un documento independiente. Al consultar un archivo en GridFS, el controlador ensambla los fragmentos según sea necesario. La implementación del controlador de GridFS es una abstracción que gestiona las operaciones y la organización del almacenamiento de archivos.

Utilice GridFS si el tamaño de sus archivos supera el límite de tamaño de documento BSON de 16 MB. GridFS también le permite acceder a los archivos sin cargarlos completamente en la memoria. Para obtener información más detallada sobre si GridFS es adecuado para su caso de uso, consulte la Página del manual del servidor GridFS.

GridFS organiza los archivos en un bucket, un grupo de colecciones de MongoDB que contiene fragmentos de archivos e información que los describe. El bucket contiene las siguientes colecciones:

  • El chunks colección, que almacena los fragmentos de archivos binarios.

  • La colección files, que almacena los metadatos del archivo.

Al crear un nuevo bucket de GridFS, el controlador crea las colecciones anteriores. El nombre de bucket predeterminado fs precede a los nombres de las colecciones, a menos que se especifique un nombre de bucket diferente. El controlador crea el nuevo bucket de GridFS durante la primera operación de escritura.

El controlador también crea un índice en cada colección para garantizar la recuperación eficiente de los archivos y metadatos relacionados. El controlador crea índices si no existen y cuando el depósito está vacío. Para obtener más información sobre los índices de GridFS, consulte la página del manual del servidor sobre índices de GridFS.

Al almacenar archivos con GridFS, el controlador divide los archivos en fragmentos más pequeños, cada uno representado por un documento independiente en la colección chunks. También crea un documento en la colección files que contiene el ID, el nombre y otros metadatos del archivo. El siguiente diagrama muestra cómo GridFS divide los archivos cargados:

Un diagrama que muestra cómo GridFS sube un archivo a un bucket

Al recuperar archivos, GridFS obtiene los metadatos de la colección files en el depósito especificado y luego utiliza esa información para reconstruir el archivo a partir de los documentos de la colección chunks. Puede leer el archivo en memoria o exportarlo a una secuencia.

Para obtener más información sobre las operaciones de GridFS y cómo realizarlas, navegue a las siguientes secciones:

Para almacenar o recuperar archivos de GridFS, cree un bucket u obtenga una referencia a un bucket existente en una base de datos MongoDB. Para crear una instancia GridFSBucket, llame al método NewBucket() con un parámetro de base de datos:

db := client.Database("db")
bucket, err := gridfs.NewBucket(db)
if err != nil {
panic(err)
}

Nota

Si ya existe un depósito GridFS, el método NewBucket() devuelve una referencia al depósito en lugar de crear una instancia nueva.

De forma predeterminada, el nuevo depósito se llama fs. Para crear una instancia de un depósito con un nombre personalizado, llame al método SetName() en una instancia BucketOptions como se indica a continuación:

db := client.Database("db")
opts := options.GridFSBucket().SetName("custom name")
bucket, err := gridfs.NewBucket(db, opts)
if err != nil {
panic(err)
}

Puede cargar un archivo en un depósito GridFS de una de las siguientes maneras:

  • Utilice el método UploadFromStream(), que lee desde un flujo de entrada.

  • Utilice el método OpenUploadStream(), que escribe en un flujo de salida.

Para cualquiera de los procesos de carga, puedes especificar información de configuración en una instancia de UploadOptions. Para ver una lista completa de los campos UploadOptions, visita la documentación de la API.

Para cargar un archivo con un flujo de entrada, utilice el método UploadFromStream() con los siguientes parámetros:

  • Su nombre de archivo

  • Un io.Reader, con el archivo abierto como parámetro

  • Un parámetro opts opcional para modificar el comportamiento de UploadFromStream()

El siguiente ejemplo de código lee un archivo llamado file.txt y sube el contenido a un bucket de GridFS. Utiliza el parámetro opts para configurar los metadatos del archivo:

file, err := os.Open("path/to/file.txt")
uploadOpts := options.GridFSUpload().SetMetadata(bson.D{{"metadata tag", "first"}})
objectID, err := bucket.UploadFromStream("file.txt", io.Reader(file),
uploadOpts)
if err != nil {
panic(err)
}
fmt.Printf("New file uploaded with ID %s", objectID)
New file uploaded with ID 62e00...

Para cargar un archivo con un flujo de salida, use el método OpenUploadStream() con los siguientes parámetros:

  • Su nombre de archivo

  • Un parámetro opts opcional para modificar el comportamiento de OpenUploadStream()

El siguiente ejemplo de código abre un flujo de carga en un bucket de GridFS y establece el número de bytes de cada fragmento con un parámetro opts. Luego, llama al método Write() en el contenido de file.txt para escribir su contenido en el flujo:

file, err := os.Open("path/to/file.txt")
if err != nil {
panic(err)
}
// Defines options that specify configuration information for files
// uploaded to the bucket
uploadOpts := options.GridFSUpload().SetChunkSizeBytes(200000)
// Writes a file to an output stream
uploadStream, err := bucket.OpenUploadStream("file.txt", uploadOpts)
if err != nil {
panic(err)
}
fileContent, err := io.ReadAll(file)
if err != nil {
panic(err)
}
var bytes int
if bytes, err = uploadStream.Write(fileContent); err != nil {
panic(err)
}
fmt.Printf("New file uploaded with %d bytes written", bytes)
// Calls the Close() method to write file metadata
if err := uploadStream.Close(); err != nil {
panic(err)
}

Puede recuperar los metadatos de los archivos almacenados en la colección files del bucket GridFS. Cada documento de la colección files contiene la siguiente información:

  • El ID del archivo

  • La longitud del archivo

  • El tamaño máximo del fragmento

  • La fecha y hora de carga

  • El nombre del archivo

  • Un documento metadata en el que puedes almacenar cualquier otra información

Para recuperar datos de archivo, llame al método Find() en una instancia GridFSBucket. Puede pasar un filtro de consulta como argumento a Find() para que coincida solo con ciertos documentos de archivo.

Nota

El método Find() requiere un filtro de consulta como parámetro. Para buscar todos los documentos de la colección files, pase un filtro de consulta vacío a Find().

El siguiente ejemplo recupera el nombre de archivo y la longitud de los documentos en la colección files con valores length mayores que 1500:

filter := bson.D{{"length", bson.D{{"$gt", 1500}}}}
cursor, err := bucket.Find(filter)
if err != nil {
panic(err)
}
type gridfsFile struct {
Name string `bson:"filename"`
Length int64 `bson:"length"`
}
var foundFiles []gridfsFile
if err = cursor.All(context.TODO(), &foundFiles); err != nil {
panic(err)
}
for _, file := range foundFiles {
fmt.Printf("filename: %s, length: %d\n", file.Name, file.Length)
}

Puede descargar un archivo GridFS de una de las siguientes maneras:

  • Utilice el método DownloadToStream() para descargar un archivo a un flujo de salida.

  • Utilice el método OpenDownloadStream() para abrir un flujo de entrada.

Puede descargar un archivo de un bucket de GridFS directamente a un flujo de salida mediante el método DownloadToStream(). DownloadToStream() toma un ID de archivo y un io.Writer como parámetros. El método descarga el archivo con el ID especificado y lo escribe en io.Writer.

El siguiente ejemplo descarga un archivo y escribe en un búfer de archivos:

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
fileBuffer := bytes.NewBuffer(nil)
if _, err := bucket.DownloadToStream(id, fileBuffer); err != nil {
panic(err)
}

Puede descargar un archivo en un bucket GridFS a la memoria con un flujo de entrada usando el método OpenDownloadStream(). OpenDownloadStream() toma un ID de archivo como parámetro y devuelve un flujo de entrada desde el cual puede leer el archivo.

El siguiente ejemplo descarga un archivo en la memoria y lee su contenido:

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
downloadStream, err := bucket.OpenDownloadStream(id)
if err != nil {
panic(err)
}
fileBytes := make([]byte, 1024)
if _, err := downloadStream.Read(fileBytes); err != nil {
panic(err)
}

Puedes actualizar el nombre de un archivo GridFS en tu bucket usando el método Rename(). Pasa un valor de ID de archivo y un nuevo valor filename como argumentos a Rename().

El siguiente ejemplo cambia el nombre de un archivo a "mongodbTutorial.zip":

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
if err := bucket.Rename(id, "mongodbTutorial.zip"); err != nil {
panic(err)
}

Puedes eliminar un archivo de tu bucket de GridFS con el método Delete(). Pasa un valor de ID de archivo como argumento a Delete().

El siguiente ejemplo elimina un archivo:

id, err := primitive.ObjectIDFromHex("62f7bd54a6e4452da13b3e88")
if err := bucket.Delete(id); err != nil {
panic(err)
}

Puede eliminar un depósito GridFS utilizando el método Drop().

El siguiente ejemplo de código elimina un depósito GridFS:

if err := bucket.Drop(); err != nil {
panic(err)
}

Para obtener más información sobre GridFS y sus operaciones, visita la página del manual de GridFS.

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

Volver

Monitoreo de conexión

En esta página