GridFS in Spring Data MongoDB

1. Overzicht

In deze tutorial wordt een van de kernfuncties van Spring Data MongoDB: interactie met GridFS.

De GridFS-opslagspecificatie wordt voornamelijk gebruikt voor het werken met bestanden die de BSON- maximale documentgrootte van 16 MB. En Spring Data biedt een GridFsOperations interface en de implementatie ervan - GridFsTemplate - om gemakkelijk te communiceren met dit bestandssysteem.

2. Configuratie

2.1. XML-configuratie

Laten we beginnen met de eenvoudige XML-configuratie voor het GridFsTemplate:

De constructorargumenten voor de GridFsTemplate boonverwijzingen opnemen naar mongoDbFactory, waarmee een Mongo-database wordt gemaakt, en mongoConverter, dat converteert tussen Java- en MongoDB-typen. Hun boondefinities staan ​​hieronder.

2.2. Java-configuratie

Laten we een vergelijkbare configuratie maken, alleen met Java:

@Configuration @EnableMongoRepositories (basePackages = "com.baeldung.repository") openbare klasse MongoConfig breidt AbstractMongoClientConfiguration uit {@Autowired private MappingMongoConverter mongoConverter; @Bean openbare GridFsTemplate gridFsTemplate () gooit uitzondering {retourneer nieuwe GridFsTemplate (mongoDbFactory (), mongoConverter); } // ...}

Voor deze configuratie hebben we de mongoDbFactory () methode en auto-wired de MappingMongoConverter gedefinieerd in de bovenliggende klasse AbstractMongoClientConfiguration.

3. GridFsTemplate Kernmethoden

3.1. winkel

De winkel methode slaat een bestand op in MongoDB.

Stel dat we een lege database hebben en er een bestand in willen opslaan:

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

Merk op dat we aanvullende metadata samen met het bestand kunnen opslaan door een DBObject naar de winkel methode. Voor ons voorbeeld is de DBObject zou er ongeveer zo uit kunnen zien:

DBObject metaData = nieuwe BasicDBObject (); metaData.put ("gebruiker", "alex");

GridFS gebruikt twee verzamelingen om de metagegevens van het bestand en de inhoud ervan op te slaan. De metagegevens van het bestand worden opgeslagen in de bestanden collectie, en de inhoud van het bestand wordt opgeslagen in de brokken verzameling. Beide collecties hebben het voorvoegsel fs.

Als we het MongoDB-commando uitvoeren db [‘fs.files ']. find (), we zullen de fs.bestanden verzameling:

{"_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"}

Het bevel db [‘fs.chunks ']. find () haalt de inhoud van het bestand op:

{ "_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 khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYD KPp98 / 5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF fyZB + AeG80riueQdVfObC / tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5 + ePEoMvUdc5a3XlSsgUhZGjGM / TGAqjz + SfuT7DDmGC6WzzeyOv0 + 2amOrr3KylzTUwjjDeWGbJJ9 / COI yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf / Z", "$ type": "00"}}

3.2. vind een

vind een geeft precies één document terug dat voldoet aan de opgegeven zoekcriteria.

String id = "5602de6e5d8bba0d6f2e45e4"; GridFSFile gridFsFile = gridFsTemplate.findOne (nieuwe Query (Criteria.where ("_ id"). Is (id))); 

De bovenstaande code retourneert het resultaatrecord dat in het bovenstaande voorbeeld is toegevoegd. Als de database meer dan één record bevatte die overeenkwamen met de query, zou het slechts één document retourneren. Het specifieke geretourneerde record wordt geselecteerd volgens de natuurlijke volgorde (de volgorde waarin de documenten in de database zijn opgeslagen).

3.3. vind

vind selecteert documenten uit een verzameling en brengt een cursor terug naar de geselecteerde documenten.

Stel dat we de volgende database hebben met 2 records:

[{"_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"}]

Als we de GridFsTemplate om de volgende zoekopdracht uit te voeren:

Lijst fileList = nieuwe ArrayList (); gridFsTemplate.find (nieuwe Query ()). into (fileList);

De resulterende lijst moet twee records bevatten, aangezien we geen criteria hebben opgegeven.

We kunnen natuurlijk enkele criteria geven voor de vind methode. Als we bijvoorbeeld bestanden willen ophalen waarvan de metagegevens gebruikers met naam bevatten Alex, de code zou zijn:

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

De resulterende lijst bevat slechts één record.

3.4. verwijderen

verwijderen verwijdert documenten uit een collectie.

Als we de database uit het vorige voorbeeld gebruiken, stel dat we de code hebben:

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

Na het uitvoeren verwijderen, blijft er slechts één record in de database:

{"_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"}

met brokken:

{ "_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 khUPYNOx92vW9PcrdDW0FUJqOp7po5ETIYMxOdyOAK0qAvcgKPWa0oMTo7SEYD KPp98 / 5wPoJsx3rZ1wLhojS9iinLD9w9W47iSwVe0Z3wfrPoce2eC4I6rCX9MxrpUpWqudNunUosNLR1EkiyIGDqUKF fyZB + AeG80riueQdVfObC / tN1pLdaLfSxMiRQ08aIg2CjtGAB9uEyCSqSWujICUXwghT57A5 + ePEoMvUdc5a3XlSsgUhZGjGM / TGAqjz + SfuT7DDmGC6WzzeyOv0 + 2amOrr3KylzTUwjjDeWGbJJ9 / COI yvRFFv1iRsVGDaqYGWVsIoBZydsDhQGf / Z", "$ type": "00"}}

3.5. getResources

getResources geeft alles terug GridFsResource met het opgegeven bestandsnaampatroon.

Stel dat we de volgende records in de database hebben:

[{"_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"}
]

Laten we nu beginnen getResources een bestandspatroon gebruiken:

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

Hiermee worden de twee records geretourneerd waarvan de bestandsnamen beginnen met 'test' (in dit geval hebben ze allebei een naam test.png).

4. GridFSFile Kernmethoden

De GridFSFile API is ook vrij eenvoudig:

  • getFilename - haalt de bestandsnaam van het bestand op
  • getMetaData - haalt de metadata op voor het opgegeven bestand
  • bevatField - bepaalt of het document een veld met de opgegeven naam bevat
  • krijgen - haalt een veld uit het object op naam
  • getId - haalt de object-ID van het bestand op
  • sleutelbos - haalt de veldnamen van het object op

5. Conclusie

In dit artikel hebben we gekeken naar de GridFS kenmerken van MongoDB en hoe u ermee kunt communiceren met behulp van Spring Data MongoDB.

De implementatie van al deze voorbeelden en codefragmenten kan gevonden worden in mijn github-project - dit is een op Eclipse gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.