GridFS i Spring Data MongoDB

1. Oversigt

Denne vejledning vil udforske en af kerneegenskaber i Spring Data MongoDB: interagerer med GridFS.

GridFS-lagringsspecifikationen bruges hovedsageligt til at arbejde med filer, der overstiger BSON-dokumentstørrelsesgrænse på 16 MB. Og Spring Data giver en GridFsOperations interface og dets implementering - GridFsTemplate - for let at interagere med dette filsystem.

2. Konfiguration

2.1. XML-konfiguration

Lad os starte med den enkle XML-konfiguration til GridFsTemplate:

Konstruktøren argumenterer for GridFsTemplate inkluderer bønnehenvisninger til mongoDbFactory, der opretter en Mongo-database, og mongoConverter, der konverterer mellem Java og MongoDB typer. Deres bønnedefinitioner er nedenfor.

2.2. Java-konfiguration

Lad os oprette en lignende konfiguration, kun med Java:

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

Til denne konfiguration brugte vi mongoDbFactory () metode og auto-kablet MappingMongoConverter defineret i overordnet klasse AbstractMongoClientConfiguration.

3. GridFsTemplate Kernemetoder

3.1. butik

Det butik metoden gemmer en fil i MongoDB.

Antag, at vi har en tom database og ønsker at gemme en fil i den:

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

Bemærk, at vi kan gemme yderligere metadata sammen med filen ved at sende en DBObject til butik metode. For vores eksempel er DBObject kan se sådan ud:

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

GridFS bruger to samlinger til at gemme filens metadata og dens indhold. Filens metadata er gemt i filer samling, og filens indhold er gemt i klumper kollektion. Begge samlinger er forud for fs.

Hvis vi udfører MongoDB-kommandoen db [‘fs.files ']. find (), vi vil se fs.files kollektion:

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

Kommandoen db [‘fs.chunks ']. find () henter filens indhold:

{ "_Id" Objekt-( "5602de6e5d8bba0d6f2e45e4"), "files_id" Objekt-( "5602de6e5d8bba0d6f2e45e4"), "n": 0, "data": { "$ binært": "/ 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. findOne

findOne returnerer nøjagtigt et dokument, der opfylder de angivne forespørgselskriterier.

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

Koden ovenfor returnerer den resultatpost, der blev tilføjet i eksemplet ovenfor. Hvis databasen indeholdt mere end en post, der matchede forespørgslen, ville den kun returnere et dokument. Den specifikke post, der returneres, vælges i henhold til naturlig rækkefølge (rækkefølgen, hvor dokumenterne blev gemt i databasen).

3.3. finde

finde vælger dokumenter fra en samling og returnerer en markør til de valgte dokumenter.

Antag, at vi har følgende database, der indeholder 2 poster:

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

Hvis vi bruger GridFsTemplate for at udføre følgende forespørgsel:

Liste fileList = ny ArrayList (); gridFsTemplate.find (ny forespørgsel ()). i (fileList);

Den resulterende liste skal indeholde to poster, da vi ikke har angivet nogen kriterier.

Vi kan selvfølgelig give nogle kriterier for finde metode. For eksempel, hvis vi gerne vil hente filer, hvis metadata indeholder brugere med navn alex, koden ville være:

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

Den resulterende liste vil kun indeholde en post.

3.4. slet

slet fjerner dokumenter fra en samling.

Antag at vi har koden ved hjælp af databasen fra det foregående eksempel:

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

Efter udførelse slet, er der kun én post tilbage i databasen:

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

med bidder:

{ "_Id" Objekt-( "5702deyu6d8bba0d6f2e45e4"), "files_id" Objekt-( "5702deyu6d8bba0d6f2e45e4"), "n": 0, "data": { "$ binært": "/ 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 givne filnavnsmønster.

Antag, 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"), "længde": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}, {"_id": ObjectId ("5505de6e5d8bba0d6f8e4574"), "metadata": {"bruger": "david"}, "filnavn": "test.png", "aliases": null, "chunkSize": NumberLong (261120) , "uploadDate": ISODate ("2015-09-23T17: 16: 30.781Z"), "længde": 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"), "længde": NumberLong (855), "contentType": "image / png", "md5": "27c915db9aa031f1b27bb05021b695c6"}
]

Lad os nu udføre getResources ved hjælp af et filmønster:

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

Dette returnerer de to poster, hvis filnavne begynder med "test" (i dette tilfælde er de begge navngivet test.png).

4. GridFSFile Kernemetoder

Det GridFSFile API er også ret simpelt:

  • getFilename - får filnavnet på filen
  • getMetaData - får metadata for den givne fil
  • indeholderFelt - bestemmer, om dokumentet indeholder et felt med det givne navn
  • - får et felt fra objektet ved navn
  • getId - får filens objekt-id
  • keySet - får objektets feltnavne

5. Konklusion

I denne artikel kiggede vi på GridFS funktioner i MongoDB, og hvordan man interagerer med dem ved hjælp af Spring Data MongoDB.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit github-projekt - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.