データ]

  • リンク:/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ベースのプロジェクトなので、そのままインポートして実行するのは簡単なはずです。