MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

GridFS in Spring Data MongoDB

1. Übersicht

In diesem Tutorial wird eine der Kernfunktionen von Spring Data MongoDB untersucht:die Interaktion mit GridFS .

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

2. Konfiguration

2.1. XML-Konfiguration

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

<bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
    <constructor-arg ref="mongoDbFactory" />
    <constructor-arg ref="mongoConverter" />
</bean>

Die Konstruktorargumente für GridFsTemplate fügen Sie Bean-Verweise auf mongoDbFactory ein , das eine Mongo-Datenbank erstellt, und mongoConverter , die zwischen Java- und MongoDB-Typen konvertiert. Ihre Bean-Definitionen sind unten.

<mongo:db-factory id="mongoDbFactory" dbname="test" mongo-client-ref="mongoClient" />

<mongo:mapping-converter id="mongoConverter" base-package="com.baeldung.converter">
    <mongo:custom-converters base-package="com.baeldung.converter"/>
</mongo:mapping-converter>

2.2. Java-Konfiguration

Lassen Sie uns eine ähnliche Konfiguration erstellen, 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 mongoDbFactory() verwendet -Methode und automatisches Verdrahten des MappingMongoConverter definiert in der übergeordneten Klasse AbstractMongoClientConfiguration .

3. GridFsTemplate Kernmethoden

3.1. speichern

DerLaden Methode 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 zusammen mit der Datei zusätzliche Metadaten speichern können, indem wir ein DBObject übergeben zum Laden Methode. Für unser Beispiel das DBObject könnte etwa 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 werden in den Dateien gespeichert Sammlung, und der Inhalt der Datei wird in den Chunks gespeichert Sammlung. Beide Sammlungen haben das Präfix fs .

Wenn wir den MongoDB-Befehl db[‘fs.files‘].find() ausführen , sehen wir die fs.files Sammlung:

{
    "_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. 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 enthielte, der mit der Abfrage übereinstimmte, würde sie nur ein Dokument zurückgeben. Der zurückgegebene spezifische Datensatz würde gemäß der natürlichen Reihenfolge (der Reihenfolge, in der die Dokumente in der Datenbank gespeichert wurden) ausgewählt werden.

3.3. finden

finden wählt Dokumente aus einer Sammlung aus und bringt einen Cursor zu den ausgewählten Dokumenten 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 das GridFsTemplate verwenden um die folgende Abfrage auszuführen:

List<GridFSFile> fileList = new ArrayList<GridFSFile>();
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 das Finden angeben Methode. Zum Beispiel, wenn wir Dateien erhalten möchten, deren Metadaten Benutzer mit dem Namen alex enthalten , Der Code wäre:

List<GridFSFile> gridFSFiles = new ArrayList<GridFSFile>();
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 haben unter Verwendung der Datenbank aus dem vorherigen Beispiel den Code:

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

Nach dem Ausführen von Löschen , 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 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. getRessourcen

getRessourcen gibt alle GridFsResource zurück mit dem angegebenen Dateinamensmuster.

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"
    }
]

Lassen Sie uns nun getResources ausführen Verwenden eines Dateimusters:

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

Dadurch werden die beiden Datensätze zurückgegeben, deren Dateinamen mit „test“ beginnen (in diesem Fall heißen sie beide test.png ).

4. GridFSFile Kernmethoden

Die GridFSFile API ist ebenfalls recht einfach:

  • getFilename – erhält den Dateinamen der Datei
  • getMetaData – Ruft die Metadaten für die angegebene Datei ab
  • enthältFeld – bestimmt, ob das Dokument ein Feld mit dem angegebenen Namen enthält
  • erhalten – erhält ein Feld vom Objekt nach Namen
  • getId – erhält die Objekt-ID der Datei
  • Schlüsselsatz – erhält die Feldnamen des Objekts