GridFS
Nesta página
GridFS é uma especificação para armazenar e recuperar arquivos que excedem o limite de tamanho do documento BSON de 16 MB. Em vez de armazenar um arquivo grande em um único documento, o GridFS divide um arquivo em partes, ou chunks, e armazena cada um desses chunks como documentos separados.
Quando você consulta um armazenamento GridFS para um arquivo, o driver reagrupa os blocos conforme necessário.
Os exemplos de código neste guia vêm do arquivo GridFSTour.java no repositório do GitHub de código-fonte do driver.
Pré-requisitos
Você deve incluir as seguintes declarações de importação em seu programa para executar os exemplos de código neste guia:
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
Este guia usa implementações personalizadas de Subscriber
, que são descritas no guia Implementações personalizadas de assinante .
Conecte-se a um MongoDB deployment
Primeiro, conecte-se a um MongoDB deployment e declare e defina uma instância MongoDatabase
.
O código a seguir se conecta a uma MongoDB deployment standalone em execução em localhost
na porta 27017
:
MongoClient mongoClient = MongoClients.create();
Para saber mais sobre como se conectar a sistemas do MongoDB, consulte o tutorial Conectar ao MongoDB .
Crie um intervalo GridFS
O GridFS armazena arquivos em duas collections:
chunks
: armazena os blocos de arquivofiles
: armazena metadados do arquivo
As duas collections estão em um bucket comum e os nomes das collections são prefixados com o nome do bucket.
O driver fornece o método GridFSBuckets.create()
para criar instâncias GridFSBucket
:
MongoDatabase myDatabase = mongoClient.getDatabase("mydb"); // Create a gridFSBucket using the default bucket name "fs" GridFSBucket gridFSBucket = GridFSBuckets.create(myDatabase);
Você pode passar um nome de bucket para o método GridFSBuckets.create()
:
// Create a gridFSBucket with a custom bucket name "files" GridFSBucket gridFSFilesBucket = GridFSBuckets.create(myDatabase, "files");
Observação
O GridFS cria automaticamente índices nas coleções files
e chunks
quando você carrega dados no contêiner GridFS.
Carregar no GridFS
O método GridFSBucket.uploadFromPublisher()
lê o conteúdo de Publisher<ByteBuffer>
e o salva na instância GridFSBucket
.
Você pode usar o tipo GridFSUploadOptions
para configurar o tamanho do chunk ou incluir metadados adicionais.
O exemplo a seguir carrega o conteúdo de um Publisher<ByteBuffer>
em 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);
Encontre arquivos armazenados no GridFS
Para localizar os arquivos armazenados no GridFSBucket
, use o método find()
.
O exemplo a seguir imprime o nome de cada arquivo armazenado:
ConsumerSubscriber<GridFSFile> filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println(" - " + gridFSFile.getFilename())); gridFSBucket.find().subscribe(filesSubscriber); filesSubscriber.await();
Você também pode fornecer um filtro personalizado para limitar os resultados retornados. O exemplo a seguir imprime os nomes de todos os arquivos em que o valor contentType
é um valor image/png
no documento de metadados definido pelo usuário:
filesSubscriber = new ConsumerSubscriber<>(gridFSFile -> System.out.println("Found: " + gridFSFile.getFilename())); gridFSBucket.find(eq("metadata.contentType", "image/png")).subscribe(filesSubscriber); filesSubscriber.await();
Baixar do GridFS
O método downloadToPublisher()
retorna um Publisher<ByteBuffer>
que lê o conteúdo do MongoDB.
Para baixar um arquivo pelo _id
, passe o _id
para o método . O exemplo a seguir baixa um arquivo pelo arquivo _id
:
ObjectId fileId; ObservableSubscriber<ByteBuffer> downloadSubscriber = new OperationSubscriber<>(); gridFSBucket.downloadToPublisher(fileId).subscribe(downloadSubscriber);
Se você não souber o _id
do arquivo, mas souber o nome do arquivo, poderá passar o nome do arquivo para o método downloadToPublisher()
. Por padrão, ele baixará a versão mais recente do arquivo. Utilize a classe GridFSDownloadOptions
para configurar qual versão baixar.
O exemplo a seguir baixa a versão original do arquivo chamado mongodb-tutorial
:
GridFSDownloadOptions downloadOptions = new GridFSDownloadOptions().revision(0); downloadSubscriber = new OperationSubscriber<>(); gridFSBucket.downloadToPublisher("mongodb-tutorial", downloadOptions).subscribe(downloadSubscriber);
Renomear arquivos
Se você precisar renomear um arquivo, use o método rename()
.
O exemplo a seguir renomeia um arquivo para mongodbTutorial
:
ObjectId fileId; //ObjectId of a file uploaded to GridFS gridFSBucket.rename(fileId, "mongodbTutorial").subscribe(new ObservableSubscriber<Void>());
Observação
O método rename()
exige um ObjectId
em vez de um filename
para garantir que o arquivo correto seja renomeado.
Para renomear várias revisões do mesmo nome de arquivo, primeiro recupere a lista completa de arquivos. Em seguida, para cada arquivo que deve ser renomeado, execute rename()
com o _id
correspondente.
Excluir arquivos
Para excluir um arquivo do GridFSBucket
, utilize o método delete()
.
O exemplo seguinte exclui um arquivo do GridFSBucket
:
ObjectId fileId; //ObjectId of a file uploaded to GridFS gridFSBucket.delete(fileId).subscribe(new ObservableSubscriber<Void>());