GridFS in Spring Data MongoDB

1. Übersicht

In diesem Tutorial wird eine der Hauptfunktionen von Spring Data MongoDB erläutert : die Interaktion mit GridFS .

Die GridFS-Speicherspezifikation wird hauptsächlich für die Arbeit mit Dateien verwendet, die die BSON- Dokumentgrößenbeschränkung von 16 MB überschreiten. Und Spring Data bietet eine GridFsOperations- Schnittstelle und deren Implementierung - GridFsTemplate - für die einfache Interaktion mit diesem Dateisystem.

2. Konfiguration

2.1. XML-Konfiguration

Beginnen wir mit der einfachen XML-Konfiguration für die GridFsTemplate :

Zu den Konstruktorargumenten für die GridFsTemplate gehören Bean-Verweise auf mongoDbFactory , das eine Mongo-Datenbank erstellt, und mongoConverter , das zwischen Java- und MongoDB-Typen konvertiert. Ihre Bohnendefinitionen sind unten.

2.2. Java-Konfiguration

Erstellen wir eine ähnliche Konfiguration nur mit 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); } // ... }

Für diese Konfiguration haben wir die Methode mongoDbFactory () verwendet und den in der übergeordneten Klasse AbstractMongoClientConfiguration definierten M appingMongoConverter automatisch verkabelt .

3. GridFsTemplate Core - Methoden

3.1. Geschäft

Die Speichermethode speichert eine Datei in MongoDB.

Angenommen, wir haben eine leere Datenbank und möchten eine Datei darin speichern:

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

Beachten Sie, dass wir zusätzliche Metadaten zusammen mit der Datei speichern können, indem wir ein DBObject an die Speichermethode übergeben . In unserem Beispiel könnte das DBObject ungefähr so aussehen:

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

GridFS verwendet zwei Sammlungen zum Speichern der Dateimetadaten und ihres Inhalts. Die Metadaten der Datei wird in der gespeicherten Dateien Sammlung und den Inhalt der Datei wird in der gespeicherten Stücke Sammlung. Beiden Sammlungen wird fs vorangestellt .

Wenn wir den MongoDB-Befehl db ['fs.files']. Find () ausführen , sehen wir die fs.files- Auflistung:

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

Der Befehl db ['fs.chunks']. Find () ruft den Inhalt der Datei ab:

{ "_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. einen finden

findOne gibt genau ein Dokument zurück, das die angegebenen Abfragekriterien erfüllt.

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

Der obige Code gibt den Ergebnisdatensatz zurück, der im obigen Beispiel hinzugefügt wurde. Wenn die Datenbank mehr als einen Datensatz enthält, der der Abfrage entspricht, wird nur ein Dokument zurückgegeben. Der spezifische zurückgegebene Datensatz wird gemäß der natürlichen Reihenfolge ausgewählt (der Reihenfolge, in der die Dokumente in der Datenbank gespeichert wurden).

3.3. finden

find wählt Dokumente aus einer Sammlung aus und setzt einen Cursor auf die ausgewählten Dokumente zurück.

Angenommen, wir haben die folgende Datenbank mit 2 Datensätzen:

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

Wenn wir die GridFsTemplate verwenden , um die folgende Abfrage auszuführen:

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

Die resultierende Liste sollte zwei Datensätze enthalten, da wir keine Kriterien angegeben haben.

Wir können natürlich einige Kriterien für die Suchmethode angeben. Wenn wir beispielsweise Dateien abrufen möchten, deren Metadaten Benutzer mit dem Namen alex enthalten , lautet der Code:

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

Die resultierende Liste enthält nur einen Datensatz.

3.4. löschen

Löschen entfernt Dokumente aus einer Sammlung.

Angenommen, wir verwenden die Datenbank aus dem vorherigen Beispiel und haben den folgenden Code:

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

Nach dem Ausführen von delete bleibt nur ein Datensatz in der Datenbank:

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

mit Stücken:

{ "_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 gibt alle GridFsResource mit dem angegebenen Dateinamenmuster zurück.

Angenommen, wir haben die folgenden Datensätze in der Datenbank:

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

Führen wir nun getResources mit einem Dateimuster aus :

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 diesem Artikel haben wir uns die GridFS- Funktionen von MongoDB und die Interaktion mit Spring Data MongoDB angesehen.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in meinem Github-Projekt - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.