GridFS i Spring Data MongoDB

1. Oversikt

Denne opplæringen vil utforske en av kjerneegenskapene til Spring Data MongoDB: samhandle med GridFS.

GridFS-lagringsspesifikasjonen brukes hovedsakelig til å jobbe med filer som overstiger BSON-dokumentstørrelsesgrense på 16 MB. Og Spring Data gir en GridFsOperations grensesnitt og implementering av det - GridFsTemplate - for å enkelt samhandle med dette filsystemet.

2. Konfigurasjon

2.1. XML-konfigurasjon

La oss starte med den enkle XML-konfigurasjonen for GridFsTemplate:

Konstruktøren argumenterer for GridFsTemplate inkluderer bønnehenvisninger til mongoDbFactory, som oppretter en Mongo-database, og mongoConverter, som konverterer mellom Java og MongoDB typer. Deres bønnedefinisjoner er nedenfor.

2.2. Java-konfigurasjon

La oss lage en lignende konfigurasjon, bare med Java:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") offentlig klasse MongoConfig utvider AbstractMongoClientConfiguration {@Autowired private MappingMongoConverter mongoConverter; @Bean offentlig GridFsTemplate gridFsTemplate () kaster Unntak {returner nytt GridFsTemplate (mongoDbFactory (), mongoConverter); } // ...}

For denne konfigurasjonen brukte vi mongoDbFactory () metode og auto-kablet MappingMongoConverter definert i foreldreklassen AbstractMongoClientConfiguration.

3. GridFsTemplate Kjernemetoder

3.1. butikk

De butikk metoden lagrer en fil i MongoDB.

Anta at vi har en tom database og ønsker å lagre en fil i den:

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

Merk at vi kan lagre flere metadata sammen med filen ved å sende en DBObject til butikk metode. For vårt eksempel er DBObject kan se ut slik:

DBObject metaData = ny BasicDBObject (); metaData.put ("bruker", "alex");

GridFS bruker to samlinger til å lagre filens metadata og innholdet. Filens metadata lagres i filer samling, og filens innhold lagres i biter samling. Begge samlingene er prefikset med fs.

Hvis vi utfører MongoDB-kommandoen db [‘fs.files ']. finn (), vil vi se fs.files samling:

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

Kommandoen db [‘fs.chunks ']. finn () henter filens innhold:

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

3.2. Finn én

Finn én returnerer nøyaktig ett dokument som tilfredsstiller de angitte spørringskriteriene.

Streng-id = "5602de6e5d8bba0d6f2e45e4"; GridFSFile gridFsFile = gridFsTemplate.findOne (ny spørring (Criteria.where ("_ id"). Er (id))); 

Koden ovenfor returnerer resultatposten som ble lagt til i eksemplet ovenfor. Hvis databasen inneholdt mer enn én post som samsvarte med spørringen, ville den bare returnere ett dokument. Den spesifikke posten som ble returnert, ble valgt i henhold til naturlig rekkefølge (rekkefølgen dokumentene ble lagret i databasen).

3.3. finne

finne velger dokumenter fra en samling og returnerer en markør til de valgte dokumentene.

Anta at vi har følgende database som inneholder to poster:

[{"_id": ObjectId ("5602de6e5d8bba0d6f2e45e4"), "metadata": {"user": "alex"}, "filnavn": "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"}, "filnavn": "test.png", "aliases": null, "chunkSize": NumberLong (261120) , "uploadDate": ISODate ("2015-09-23T17: 16: 30.781Z"), "length": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}]

Hvis vi bruker GridFsTemplate for å utføre følgende spørsmål:

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

Den resulterende listen skal inneholde to poster, siden vi ikke oppga noen kriterier.

Vi kan selvfølgelig gi noen kriterier for finne metode. For eksempel hvis vi ønsker å få filer med metadata som inneholder brukere med navn alex, koden ville være:

Liste gridFSFiles = ny ArrayList (); gridFsTemplate.find (ny spørring (Criteria.where ("metadata.user"). er ("alex"))). inn i (gridFSFiles);

Den resulterende listen inneholder bare én post.

3.4. slett

slett fjerner dokumenter fra en samling.

Anta at vi har koden ved hjelp av databasen fra forrige eksempel:

Streng-id = "5702deyu6d8bba0d6f2e45e4"; gridFsTemplate.delete (ny spørring (Criteria.where ("_ id"). er (id))); 

Etter utførelse slett, gjenstår bare en post i databasen:

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

med biter:

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

3.5. getResources

getResources returnerer alle GridFsResource med det gitte filnavnmønsteret.

Anta at vi har følgende poster i databasen:

[{"_id": ObjectId ("5602de6e5d8bba0d6f2e45e4"), "metadata": {"user": "alex"}, "filnavn": "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"}, "filnavn": "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"}, "filnavn": "baeldung.png", "aliases": null, "chunkSize": NumberLong (261120), "uploadDate": ISODate ("2015-09-23T17: 16: 30.781Z"), "length": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}
]

La oss nå utføre getResources ved hjelp av et filmønster:

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

Dette vil returnere de to postene hvis filnavn begynner med "test" (i dette tilfellet blir de begge navngitt test.png).

4. GridFSFile Kjernemetoder

De GridFSFile API er også ganske enkelt:

  • getFilename - får filnavnet til filen
  • getMetaData - får metadata for den gitte filen
  • inneholderFelt - avgjør om dokumentet inneholder et felt med gitt navn
  • - får et felt fra objektet ved navn
  • getId - får filens objekt-ID
  • keySet - får objektets feltnavn

5. Konklusjon

I denne artikkelen så vi på GridFS funksjonene til MongoDB, og hvordan du kan samhandle med dem ved hjelp av Spring Data MongoDB.

Implementeringen av alle disse eksemplene og kodebiter finner du i mitt github-prosjekt - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found