Docs Menu
Docs Home
/ /
/ / /

GridFS

GridFS es una especificación para almacenar y recuperar archivos que superan el límite de tamaño de documento BSON de 16 MB. En lugar de almacenar un archivo grande en un solo documento, GridFS divide el archivo en partes, o fragmentos, y almacena cada uno de estos fragmentos como documentos separados.

Cuando se consulta un almacén GridFS para obtener un archivo, el controlador vuelve a ensamblar los fragmentos según sea necesario.

Los ejemplos de código en esta guía provienen de ArchivoGridFSTour.java en el repositorio de código fuente del controlador de GitHub.

Debe incluir las siguientes declaraciones de importación en su programa para ejecutar los ejemplos de código de esta guía:

import com.mongodb.reactivestreams.client.MongoClients;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoDatabase;
import com.mongodb.client.gridfs.model.*;
import com.mongodb.reactivestreams.client.gridfs.*;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import static com.mongodb.client.model.Filters.eq;
import static reactivestreams.helpers.PublisherHelpers.toPublisher;

Importante

Esta guía utiliza métodos personalizados. Subscriber implementaciones, que se describen en el Guíade implementación de suscriptores personalizados de muestra.

Primero, conéctese a una implementación de MongoDB y declare y defina una instancia MongoDatabase.

El siguiente código se conecta a una implementación independiente de MongoDB que se ejecuta en localhost en el puerto 27017:

MongoClient mongoClient = MongoClients.create();

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

GridFS almacena archivos en dos colecciones:

  • chunks: almacena los fragmentos de archivos

  • files: stores file metadata

Las dos colecciones están en un depósito común y los nombres de las colecciones tienen como prefijo el nombre del depósito.

El controlador proporciona el método GridFSBuckets.create() para crear instancias GridFSBucket:

MongoDatabase myDatabase = mongoClient.getDatabase("mydb");
// Create a gridFSBucket using the default bucket name "fs"
GridFSBucket gridFSBucket = GridFSBuckets.create(myDatabase);

Nota

GridFS crea automáticamente índices en las colecciones files y chunks cuando carga datos en el depósito GridFS.

Puede pasar un nombre de depósito al método GridFSBuckets.create():

// Create a gridFSBucket with a custom bucket name "files"
GridFSBucket gridFSFilesBucket = GridFSBuckets.create(myDatabase, "files");

Tip

Configuración de tiempo de espera

Puede usar la configuración de tiempo de espera de operación del lado del cliente (CSOT) para limitar el tiempo que el servidor tarda en finalizar las operaciones de GridFS. Para obtener más información sobre el uso de esta configuración con GridFS, consulte la sección GridFS de la guía "Limitar el tiempo de ejecución del servidor".

El método GridFSBucket.uploadFromPublisher() lee el contenido de Publisher<ByteBuffer> y lo guarda en la instancia GridFSBucket.

Puede utilizar el tipo GridFSUploadOptions para configurar el tamaño del fragmento o incluir metadatos adicionales.

El siguiente ejemplo carga el contenido de un Publisher<ByteBuffer> en GridFSBucket:

// Get the input publisher
Publisher<ByteBuffer> publisherToUploadFrom = toPublisher(
ByteBuffer
.wrap("MongoDB Tutorial..".getBytes(StandardCharsets.UTF_8))
);
// Create some custom options
GridFSUploadOptions options = new GridFSUploadOptions()
.chunkSizeBytes(1024)
.metadata(new Document("type", "presentation"));
ObservableSubscriber<ObjectId> uploadSubscriber = new OperationSubscriber<>();
gridFSBucket.uploadFromPublisher("mongodb-tutorial", publisherToUploadFrom, options).subscribe(uploadSubscriber);
ObjectId fileId = uploadSubscriber.get().get(0);

Para encontrar los archivos almacenados en GridFSBucket, utilice el método find().

El siguiente ejemplo imprime el nombre de archivo de cada archivo almacenado:

ConsumerSubscriber<GridFSFile> filesSubscriber = new ConsumerSubscriber<>(gridFSFile ->
System.out.println(" - " + gridFSFile.getFilename()));
gridFSBucket.find().subscribe(filesSubscriber);
filesSubscriber.await();

También puede proporcionar un filtro personalizado para limitar los resultados devueltos. El siguiente ejemplo imprime los nombres de todos los archivos cuyo valor contentType es image/png en el documento de metadatos definido por el usuario:

filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println("Found: " + gridFSFile.getFilename()));
gridFSBucket.find(eq("metadata.contentType", "image/png")).subscribe(filesSubscriber);
filesSubscriber.await();

El método downloadToPublisher() devuelve un Publisher<ByteBuffer> que lee el contenido de MongoDB.

Para descargar un archivo por su _id de archivo, pasa el _id al método. El siguiente ejemplo descarga un archivo por su archivo _id:

ObjectId fileId;
ObservableSubscriber<ByteBuffer> downloadSubscriber = new OperationSubscriber<>();
gridFSBucket.downloadToPublisher(fileId).subscribe(downloadSubscriber);

Si desconoce el _id del archivo, pero conoce su nombre, puede pasarlo al método downloadToPublisher(). De forma predeterminada, descargará la última versión del archivo. Use la clase GridFSDownloadOptions para configurar la versión a descargar.

El siguiente ejemplo descarga la versión original del archivo llamado mongodb-tutorial:

GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(0);
downloadSubscriber = new OperationSubscriber<>();
gridFSBucket.downloadToPublisher("mongodb-tutorial", downloadOptions).subscribe(downloadSubscriber);

Si necesita cambiar el nombre de un archivo, utilice el método rename().

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

ObjectId fileId; //ObjectId of a file uploaded to GridFS
gridFSBucket.rename(fileId, "mongodbTutorial").subscribe(new ObservableSubscriber<Void>());

Nota

El método rename() requiere un ObjectId en lugar de un filename para garantizar que se cambie el nombre del archivo correcto.

Para renombrar varias revisiones del mismo archivo, primero recupere la lista completa de archivos. Luego, para cada archivo que deba renombrarse, ejecute rename() con el _id ​​correspondiente.

Para eliminar un archivo del GridFSBucket, utilice el método delete().

El siguiente ejemplo elimina un archivo del GridFSBucket:

ObjectId fileId; //ObjectId of a file uploaded to GridFS
gridFSBucket.delete(fileId).subscribe(new ObservableSubscriber<Void>());

Volver

Transacciones

En esta página