GridFS in Spring Data MongoDB
1. Überblick
In diesem Tutorial wird eines dercore features of Spring Data MongoDB: interacting with*GridFS*. untersucht
Die GridFS-Speicherspezifikation wird hauptsächlich für die Arbeit mit Dateien verwendet, die dieBSON-Dokumentgrößenbeschränkung von 16 MB überschreiten. Und Spring Data bietet eineGridFsOperations-Schnittstelle und deren Implementierung– GridFsTemplate - um einfach mit diesem Dateisystem zu interagieren.
2. Aufbau
2.1. XML-Konfiguration
Beginnen wir mit der einfachen XML-Konfiguration fürGridFsTemplate:
Die Konstruktorargumente fürGridFsTemplate enthalten Bean-Verweise aufmongoDbFactory, die eine Mongo-Datenbank erstellen, undmongoConverter, die zwischen Java- und MongoDB-Typen konvertieren. Ihre Bohnendefinitionen sind unten.
2.2. Java-Konfiguration
Erstellen wir eine ähnliche Konfiguration nur mit Java:
@Bean
public GridFsTemplate gridFsTemplate() throws Exception {
return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
}
Für diese Konfiguration haben wirmongoDbFactory undmappingMongoConverter vonorg.springframework.data.mongodb.config.AbstractMongoConfiguration verwendet.
3. GridFsTemplate Kernmethoden
3.1. store
Die Methodestore 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 einDBObject an diestore-Methode übergeben. In unserem Beispiel könnten dieDBObject ungefähr so aussehen:
DBObject metaData = new BasicDBObject();
metaData.put("user", "alex");
GridFS verwendet zwei Sammlungen, um die Dateimetadaten und ihren Inhalt zu speichern. Die Metadaten der Datei werden in der Sammlung vonfilesund der Inhalt der Datei in der Sammlung vonchunksgespeichert. Beiden Sammlungen wirdfs vorangestellt.
Wenn wir den MongoDB-Befehldb[‘fs.files'].find() ausführen, wird die Auflistungfs.files angezeigt:
{
"_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 Befehldb[‘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. findOne
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 mit der Abfrage übereinstimmt, wird nur ein Dokument zurückgegeben. Der spezifische zurückgegebene Datensatz würde gemäß der natürlichen Reihenfolge (der Reihenfolge, in der die Dokumente in der Datenbank gespeichert wurden) ausgewählt.
3.3. find
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 wirGridFsTemplate 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 diefind-Methode angeben. Wenn wir beispielsweise Dateien abrufen möchten, deren Metadaten Benutzer mit dem Namenalex, 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. delete
delete entfernt Dokumente aus einer Sammlung.
Nehmen wir an, wir verwenden die Datenbank aus dem vorherigen Beispiel und haben den Code:
String id = "5702deyu6d8bba0d6f2e45e4";
gridFsTemplate.delete(new Query(Criteria.where("_id").is(id)));
Nach dem Ausführen vondelete verbleibt 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 Brocken:
{
"_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 alleGridFsResource 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" : "example.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 nungetResources mit einem Dateimuster aus:
GridFsResource[] gridFsResource = gridFsTemplate.getResources("test*");
Dies gibt die beiden Datensätze zurück, deren Dateinamen mit "test" beginnen (in diesem Fall heißen beidetest.png).
4. GridFSFile Kernmethoden
DieGridFSFile API ist ebenfalls recht einfach:
-
getFilename - Ruft den Dateinamen der Datei ab
-
getMetaData - Ruft die Metadaten für die angegebene Datei ab
-
containsField - Bestimmt, ob das Dokument ein Feld mit dem angegebenen Namen enthält
-
get - Ruft ein Feld vom Namen des Objekts ab
-
getId - Ruft die Objekt-ID der Datei ab
-
keySet - Ruft die Feldnamen des Objekts ab
5. Fazit
In diesem Artikel haben wir uns dieGridFS-Funktionen von MongoDB und die Interaktion mit Spring Data MongoDB angesehen.
Die Implementierung all dieser Beispiele und Codefragmentecan be found inmy github project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.