GridFS in Spring Data MongoDB

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.