sql >> Database teknologi >  >> NoSQL >> MongoDB

GridFS i Spring Data MongoDB

1. Oversigt

Denne tutorial vil udforske en af ​​kernefunktionerne i Spring Data MongoDB:interaktion med GridFS .

GridFS-lagringsspecifikationen bruges hovedsageligt til at arbejde med filer, der overstiger BSON - Dokumentstørrelsesgrænse på 16 MB. Og Spring Data giver en GridFsOperations grænsefladen og dens implementering – GridFsTemplate – for nemt at interagere med dette filsystem.

2. Konfiguration

2.1. XML-konfiguration

Lad os starte med den simple XML-konfiguration for GridFsTemplate :

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

Konstruktørargumenterne til GridFsTemplate inkludere bønnereferencer til mongoDbFactory , som opretter en Mongo-database og mongoConverter , som konverterer mellem Java- og MongoDB-typer. Deres bønnedefinitioner er nedenfor.

<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

Lad os oprette en lignende konfiguration, kun med 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);
    }
    
    // ...
} 

Til denne konfiguration brugte vi mongoDbFactory() metoden og automatisk tilsluttede MappingMongoConverter defineret i den overordnede klasse AbstractMongoClientConfiguration .

3. GridFsTemplate Kernemetoder

3.1. butik

butikken metode gemmer en fil i MongoDB.

Antag, at vi har en tom database og ønsker at gemme en fil i den:

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

Bemærk, at vi kan gemme yderligere metadata sammen med filen ved at sende et DBObject til butikken metode. For vores eksempel er DBObject kan se sådan ud:

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

GridFS bruger to samlinger til at gemme filens metadata og dens indhold. Filens metadata er gemt i filerne samling, og filens indhold gemmes i klumperne kollektion. Begge samlinger er præfikset med fs .

Hvis vi udfører MongoDB-kommandoen db[‘fs.files'].find() , vil vi se fs.files samling:

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

Kommandoen db[‘fs.chunks'].find() henter filens indhold:

{
    "_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 returnerer præcis ét dokument, der opfylder de angivne forespørgselskriterier.

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

Ovenstående kode vil returnere resultatposten, som blev tilføjet i eksemplet ovenfor. Hvis databasen indeholdt mere end én post, som matchede forespørgslen, ville den kun returnere ét dokument. Den specifikke post, der returneres, vil blive valgt i henhold til naturlig rækkefølge (den rækkefølge, som dokumenterne blev gemt i databasen).

3.3. find

find vælger dokumenter fra en samling og returnerer en markør til de valgte dokumenter.

Antag, at vi har følgende database, der indeholder 2 poster:

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

Hvis vi bruger GridFsTemplate for at udføre følgende forespørgsel:

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

Den resulterende liste bør indeholde to poster, da vi ikke har angivet nogen kriterier.

Vi kan selvfølgelig give nogle kriterier for fundet metode. For eksempel, hvis vi gerne vil have filer, hvis metadata indeholder brugere med navnet alex , koden ville være:

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

Den resulterende liste vil kun indeholde én post.

3.4. slet

slet fjerner dokumenter fra en samling.

Brug databasen fra det foregående eksempel, antag at vi har koden:

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

Efter at have udført slet , kun én post tilbage i databasen:

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

med bidder:

{
    "_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 returnerer alle GridFsResource med det givne filnavnmønster.

Antag, at vi har følgende poster i databasen:

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

Lad os nu udføre getResources ved hjælp af et filmønster:

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

Dette vil returnere de to poster, hvis filnavne begynder med "test" (i dette tilfælde hedder de begge test.png ).

4. GridFSFile Kernemetoder

GridFSFile API er også ret simpelt:

  • getFilename – henter filnavnet på filen
  • getMetaData – henter metadata for den givne fil
  • containsField – bestemmer, om dokumentet indeholder et felt med det angivne navn
  • – får et felt fra objektet ved navn
  • getId – henter filens objekt-id
  • nøglesæt – henter objektets feltnavne

  1. Hvor ofte skal jeg åbne/lukke min Booksleeve-forbindelse?

  2. Opdater felt med et andet felts værdi i dokumentet

  3. MongoDB:upsert underdokument

  4. Hvordan kommer magento med cache-nøglenavne?