sql >> データベース >  >> NoSQL >> MongoDB

SpringDataMongoDBのGridFS

    1。概要

    このチュートリアルでは、SpringDataMongoDBのコア機能の1つであるとの対話について説明します。 GridFS

    GridFSストレージ仕様は、主に BSONを超えるファイルを操作するために使用されます -16MBのドキュメントサイズ制限。また、SpringDataは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へのコンストラクター引数 mongoDbFactoryへのBean参照を含める 、Mongoデータベースを作成し、 mongoConverter 、JavaタイプとMongoDBタイプの間で変換します。それらのBeanの定義は以下のとおりです。

    <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構成

    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);
        }
        
        // ...
    }

    この構成では、 mongoDbFactory()を使用しました メソッドとMappingMongoConverterの自動配線 親クラスで定義AbstractMongoClientConfiguration

    3。 GridFsTemplate コアメソッド

    3.1。 ストア

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

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

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

    DBObject を渡すことで、ファイルとともに追加のメタデータを保存できることに注意してください。 ストアへ 方法。この例では、 DBObject 次のようになります:

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

    GridFS 2つのコレクションを使用して、ファイルのメタデータとそのコンテンツを保存します。ファイルのメタデータはファイルに保存されます コレクションであり、ファイルのコンテンツはチャンクに保存されます コレクション。どちらのコレクションにも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。 検索

    検索 コレクションからドキュメントを選択し、選択したドキュメントにカーソルを戻します。

    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つのレコードが含まれているはずです。

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

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

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

    3.4。 削除

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

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

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

    削除を実行した後 、データベースに残っているレコードは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 –オブジェクトのフィールド名を取得します

    1. BookSleeveからBGSAVEを呼び出す方法は?

    2. MongoDB $ sqrt

    3. 一意のインデックスでのmongo3の重複-dropDups

    4. データベースとしてのNoSQL(MongoDB)とLucene(またはSolr)