GridFS in Spring Data MongoDB

1. Panoramica

Questo tutorial esplorerà una delle funzionalità principali di Spring Data MongoDB: l'interazione con GridFS .

La specifica di archiviazione GridFS viene utilizzata principalmente per lavorare con file che superano il limite di dimensioni del documento BSON di 16 MB. E Spring Data fornisce un'interfaccia GridFsOperations e la sua implementazione - GridFsTemplate - per interagire facilmente con questo filesystem.

2. Configurazione

2.1. Configurazione XML

Cominciamo con la semplice configurazione XML per GridFsTemplate :

Gli argomenti del costruttore per GridFsTemplate includono riferimenti ai bean a mongoDbFactory , che crea un database Mongo, e mongoConverter , che converte tra i tipi Java e MongoDB. Le loro definizioni dei fagioli sono di seguito.

2.2. Configurazione Java

Creiamo una configurazione simile, solo con Java:

@Configuration @EnableMongoRepositories(basePackages = "com.baeldung.repository") public class MongoConfig extends AbstractMongoClientConfiguration { @Autowired private MappingMongoConverter mongoConverter; @Bean public GridFsTemplate gridFsTemplate() throws Exception { return new GridFsTemplate(mongoDbFactory(), mongoConverter); } // ... }

Per questa configurazione, abbiamo utilizzato il metodo mongoDbFactory () e abbiamo cablato automaticamente il M appingMongoConverter definito nella classe padre AbstractMongoClientConfiguration .

3. Metodi di base GridFsTemplate

3.1. negozio

Il metodo store salva un file in MongoDB.

Supponiamo di avere un database vuoto e di voler memorizzare un file al suo interno:

InputStream inputStream = new FileInputStream("src/main/resources/test.png"); gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).toString();

Nota che possiamo salvare metadati aggiuntivi insieme al file passando un DBObject al metodo store . Per il nostro esempio, DBObject potrebbe essere simile a questo:

DBObject metaData = new BasicDBObject(); metaData.put("user", "alex");

GridFS utilizza due raccolte per archiviare i metadati del file e il relativo contenuto. I metadati del file vengono archiviati nella raccolta di file e il contenuto del file viene archiviato nella raccolta di blocchi . Entrambe le raccolte hanno il prefisso fs .

Se eseguiamo il comando MongoDB db ['fs.files']. Find () , vedremo la raccolta fs.files :

{ "_id" : ObjectId("5602de6e5d8bba0d6f2e45e4"), "metadata" : { "user" : "alex" }, "filename" : "test.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" }

Il comando db ['fs.chunks']. Find () recupera il contenuto del file:

{ "_id" : ObjectId("5602de6e5d8bba0d6f2e45e4"), "files_id" : ObjectId("5602de6e5d8bba0d6f2e45e4"), "n" : 0, "data" : { "$binary" : "/9j/4AAQSkZJRgABAQAAAQABAAD/4QAqRXhpZgAASUkqAAgAAAABADEBAgAHAAAAGgAAAAAAAABHb29nbGUAAP/bAIQAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggM CgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFAEDBAQGBQUJBgYKDw4MDhQUFA8RDQwMEA0QDA8VDA0NDw0MDw4MDA0ODxAMDQ0MDAwODA8MDQ4NDA0NDAwNDAwQ/8AA EQgAHAAcAwERAAIRAQMRAf/EABgAAQEBAQEAAAAAAAAAAAAAAAgGBwUE/8QALBAAAgEDAgQFAwUAAAAAAAAAAQIDBAURBiEABwgSIjFBYXEyUYETFEKhw f/EABoBAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgD/xAAiEQACAgEDBAMAAAAAAAAAAAAAAQIRAyIx8BJRYYETIUH/2gAMAwEAAhEDEQA/AHDyq1Bb6GjFPMAszLkZHHCTi1I6O cXOFRZ1ZqoX6aqzRClkhb9MGVh2SsNyVI/hjG5389tuGcUaLK1GmFfpn5r3rnXpfV82pGtS3a0XmaGOO3zguKV1SWDwBQDH2uUWTOWMZzuM8bS0VQtJKRb2li9LL3l+4VNQPEfQTOB/WO G1K0JtUzwad1eZaYBiqzL4S2N8cZUsa7DqlRGdWvMq5aX6b9Tvb5pIZbggt7VcU3YacSkDbfuLNuu3lkk+98GNfIrLt2gK9K/NWl5Z87Ldebj3R0NTa2tVVKhOI0KoQ5AG4DRqSPk+gHGn khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYDKPp98/5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF fyZB+AeG80riueQdVfObC/tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5+ePEoMvUdc5a3XlSsgUhZGjGM/TGAqjz+SfuT7DDmGC6WzzeyOv0+2amOrr3KylzTUwjjDeWGbJJ9/COI yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf/Z", "$type" : "00" } }

3.2. trova uno

findOne restituisce esattamente un documento che soddisfa i criteri di query specificati.

String id = "5602de6e5d8bba0d6f2e45e4"; GridFSFile gridFsFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id))); 

Il codice sopra restituirà il record del risultato che è stato aggiunto nell'esempio precedente. Se il database conteneva più di un record che corrisponde alla query, restituirà un solo documento. Il record specifico restituito verrà selezionato in base all'ordinamento naturale (l'ordine in cui i documenti sono stati archiviati nel database).

3.3. trova

find seleziona i documenti da una raccolta e riporta un cursore sui documenti selezionati.

Supponiamo di avere il seguente database, contenente 2 record:

[ { "_id" : ObjectId("5602de6e5d8bba0d6f2e45e4"), "metadata" : { "user" : "alex" }, "filename" : "test.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" }, { "_id" : ObjectId("5702deyu6d8bba0d6f2e45e4"), "metadata" : { "user" : "david" }, "filename" : "test.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" } ]

Se usiamo GridFsTemplate per eseguire la seguente query:

List fileList = new ArrayList(); gridFsTemplate.find(new Query()).into(fileList);

L'elenco risultante dovrebbe contenere due record poiché non abbiamo fornito criteri.

Possiamo, ovviamente, fornire alcuni criteri per il metodo di ricerca . Ad esempio, se desideriamo ottenere file i cui metadati contengono utenti con nome alex , il codice sarebbe:

List gridFSFiles = new ArrayList(); gridFsTemplate.find(new Query(Criteria.where("metadata.user").is("alex"))).into(gridFSFiles);

L'elenco risultante conterrà un solo record.

3.4. Elimina

elimina rimuove i documenti da una raccolta.

Utilizzando il database dell'esempio precedente, supponiamo di avere il codice:

String id = "5702deyu6d8bba0d6f2e45e4"; gridFsTemplate.delete(new Query(Criteria.where("_id").is(id))); 

Dopo aver eseguito l' eliminazione , nel database rimane solo un record:

{ "_id" : ObjectId("5702deyu6d8bba0d6f2e45e4"), "metadata" : { "user" : "alex" }, "filename" : "test.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" }

con pezzi:

{ "_id" : ObjectId("5702deyu6d8bba0d6f2e45e4"), "files_id" : ObjectId("5702deyu6d8bba0d6f2e45e4"), "n" : 0, "data" : { "$binary" : "/9j/4AAQSkZJRgABAQAAAQABAAD/4QAqRXhpZgAASUkqAAgAAAABADEBAgAHAAAAGgAAAAAAAABHb29nbGUAAP/bAIQAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggM CgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFAEDBAQGBQUJBgYKDw4MDhQUFA8RDQwMEA0QDA8VDA0NDw0MDw4MDA0ODxAMDQ0MDAwODA8MDQ4NDA0NDAwNDAwQ/8AA EQgAHAAcAwERAAIRAQMRAf/EABgAAQEBAQEAAAAAAAAAAAAAAAgGBwUE/8QALBAAAgEDAgQFAwUAAAAAAAAAAQIDBAURBiEABwgSIjFBYXEyUYETFEKhw f/EABoBAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgD/xAAiEQACAgEDBAMAAAAAAAAAAAAAAQIRAyIx8BJRYYETIUH/2gAMAwEAAhEDEQA/AHDyq1Bb6GjFPMAszLkZHHCTi1I6O cXOFRZ1ZqoX6aqzRClkhb9MGVh2SsNyVI/hjG5389tuGcUaLK1GmFfpn5r3rnXpfV82pGtS3a0XmaGOO3zguKV1SWDwBQDH2uUWTOWMZzuM8bS0VQtJKRb2li9LL3l+4VNQPEfQTOB/WO G1K0JtUzwad1eZaYBiqzL4S2N8cZUsa7DqlRGdWvMq5aX6b9Tvb5pIZbggt7VcU3YacSkDbfuLNuu3lkk+98GNfIrLt2gK9K/NWl5Z87Ldebj3R0NTa2tVVKhOI0KoQ5AG4DRqSPk+gHGn khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYDKPp98/5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF fyZB+AeG80riueQdVfObC/tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5+ePEoMvUdc5a3XlSsgUhZGjGM/TGAqjz+SfuT7DDmGC6WzzeyOv0+2amOrr3KylzTUwjjDeWGbJJ9/COI yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf/Z", "$type" : "00" } }

3.5. getResources

getResources restituisce tutte le GridFsResource con il modello di nome file specificato.

Supponiamo di avere i seguenti record nel database:

[ { "_id" : ObjectId("5602de6e5d8bba0d6f2e45e4"), "metadata" : { "user" : "alex" }, "filename" : "test.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" }, { "_id" : ObjectId("5505de6e5d8bba0d6f8e4574"), "metadata" : { "user" : "david" }, "filename" : "test.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" }, { "_id" : ObjectId("5777de6e5d8bba0d6f8e4574"), "metadata" : { "user" : "eugen" }, "filename" : "baeldung.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" }
]

Ora eseguiamo getResources usando un pattern di file:

GridFsResource[] gridFsResource = gridFsTemplate.getResources("test*");

This will return the two records whose file names begin with “test” (in this case, they are both named test.png).

4. GridFSFile Core Methods

The GridFSFile API is quite simple as well:

  • getFilename – gets the filename of the file
  • getMetaData – gets the metadata for the given file
  • containsField – determines if the document contains a field with the given name
  • get – gets a field from the object by name
  • getId – gets the file's object ID
  • keySet – gets the object's field names

5. Conclusion

In questo articolo abbiamo esaminato le funzionalità GridFS di MongoDB e come interagire con esse utilizzando Spring Data MongoDB.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata nel mio progetto GitHub : questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è.