Spring Data MongoDBのGridFS

データ]

  • リンク:/tag/mongodb/[MongoDB]

1概要

このチュートリアルでは、Spring Data MongoDBの コア機能の1つ、 GridFS . とのやり取りについて説明します。

GridFSストレージ仕様は主に、 BSON 文書サイズの上限である16MBを超えるファイルを扱うために使用されます。そしてSpring Dataは GridFsOperations インターフェースとその実装 GridFsTemplate を提供しています - このファイルシステムと簡単にやり取りするためのものです。

2構成

2.1. XML設定

GridFsTemplate の単純なXML設定から始めましょう。

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

GridFsTemplate のコンストラクター引数には、Mongoデータベースを作成する mongoDbFactory へのBean参照、およびJavaとMongoDBの型を変換する mongoConverter が含まれます。それらのBean定義は以下のとおりです。

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

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

2.2. Javaの設定

Javaだけで同様の設定を作成しましょう。

@Bean
public GridFsTemplate gridFsTemplate() throws Exception {
    return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
}

この設定では、 org.springframework.data.mongodb.config.AbstractMongoConfiguration mongoDbFactory mappingMongoConverter を使用しました。

** 3 GridFsTemplate コアメソッド

**

3.1. 格納

store メソッドはファイルをMongoDBに保存します。

空のデータベースがあり、そこにファイルを保存したいとします。

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

DBObject store メソッドに渡すことで、ファイルとともに追加のメタデータを保存できることに注意してください。この例では、 DBObject は次のようになります。

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

GridFS は、ファイルのメタデータとその内容を格納するために2つのコレクションを使用します。ファイルのメタデータは files コレクションに保存され、ファイルのコンテンツは chunks コレクションに保存されます。両方のコレクションに fs というプレフィックスが付いています。

MongoDBのコマンド db[ʻfs.files ']。find() を実行すると、 fs.files コレクションが表示されます。

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

コマンド db['fs.chunks']。find() はファイルの内容を取得します。

{
    "__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 は、指定されたクエリ条件を満たす1つのドキュメントを正確に返します。

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

上記のコードは、上記の例で追加された結果レコードを返します。データベースにクエリに一致するレコードが複数含まれている場合は、1つのドキュメントのみが返されます。返される特定のレコードは、自然な順序(文書がデータベースに格納されている順序)に従って選択されます。

3.3. find

find はコレクションから文書を選択し、選択した文書にカーソルを戻します。

次のデータベースがあり、2つのレコードが含まれているとします。

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

次のクエリを実行するために GridFsTemplate を使用するとします。

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

結果のリストには2つのレコードが含まれているはずです。これは、基準を提供していないためです。

もちろん、 find メソッドにいくつかの基準を提供することができます。たとえば、メタデータに__alexという名前のユーザーが含まれているファイルを取得する場合、コードは次のようになります。

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

結果のリストにはレコードが1つだけ含まれます。

3.4. delete

delete はコレクションからドキュメントを削除します。

前の例のデータベースを使用して、次のコードがあるとします。

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

delete を実行した後、データベースに残るレコードは1つだけです。

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

チャンク付き:

{
    "__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 は、指定されたファイル名パターンを持つすべての GridFsResource を返します。

データベースに次のレコードがあるとします。

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

それでは、ファイルパターンを使用して getResources を実行しましょう。

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

これにより、ファイル名が "test"で始まる2つのレコードが返されます(この場合、両方とも test.png という名前です)。

4 GridFSFile コアメソッド

GridFSFile APIも非常に単純です。

  • getFilename - ファイルのファイル名を取得する

  • getMetaData - 与えられたファイルのメタデータを取得する

  • containsField - ドキュメントに

名 ** get - オブジェクトから名前でフィールドを取得する

  • getId - ファイルのオブジェクトIDを取得します

  • keySet - オブジェクトのフィールド名を取得します

5結論

この記事では、MongoDBの GridFS 機能と、Spring Data MongoDBを使用してそれらと対話する方法を調べました。

これらすべての例とコードスニペットの実装は my github project ** にあります。 Eclipseベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。