GridFS dalam Spring Data MongoDB

1. Gambaran keseluruhan

Tutorial ini akan meneroka salah satu ciri utama Spring Data MongoDB: berinteraksi dengan GridFS .

Spesifikasi penyimpanan GridFS terutama digunakan untuk bekerja dengan fail yang melebihi had ukuran dokumen BSON 16MB. Dan Spring Data menyediakan antara muka GridFsOperations dan pelaksanaannya - GridFsTemplate - untuk berinteraksi dengan sistem fail ini dengan mudah.

2. Konfigurasi

2.1. Konfigurasi XML

Mari mulakan dengan konfigurasi XML mudah untuk GridFsTemplate :

Argumen konstruktor ke GridFsTemplate merangkumi rujukan kacang ke mongoDbFactory , yang membuat pangkalan data Mongo, dan mongoConverter , yang menukar antara jenis Java dan MongoDB. Definisi kacang mereka ada di bawah.

2.2. Konfigurasi Java

Mari buat konfigurasi yang serupa, hanya dengan 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); } // ... }

Untuk konfigurasi ini, kami menggunakan kaedah mongoDbFactory () dan secara automatik memasang M appingMongoConverter yang ditentukan dalam kelas induk AbstractMongoClientConfiguration .

3. Kaedah Teras GridFsTemplate

3.1. kedai

The kedai kaedah menyimpan fail ke dalam MongoDB.

Andaikan kita mempunyai pangkalan data kosong dan ingin menyimpan fail di dalamnya:

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

Perhatikan bahawa kita dapat menyimpan metadata tambahan bersama dengan fail dengan meneruskan DBObject ke kaedah penyimpanan . Contohnya, DBObject mungkin kelihatan seperti ini:

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

GridFS menggunakan dua koleksi untuk menyimpan metadata fail dan kandungannya. Metadata fail disimpan dalam koleksi fail , dan kandungan fail disimpan dalam koleksi potongan . Kedua-dua koleksi diawali dengan fs .

Sekiranya kita melaksanakan perintah MongoDB db ['fs.files']. Cari () , kita akan melihat koleksi 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" }

Perintah db ['fs.chunks']. Find () mengambil kandungan fail:

{ "_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. cariOne

findOne mengembalikan tepat satu dokumen yang memenuhi kriteria pertanyaan yang ditentukan.

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

Kod di atas akan mengembalikan rekod hasil yang ditambahkan dalam contoh di atas. Sekiranya pangkalan data mengandungi lebih daripada satu rekod yang sesuai dengan pertanyaan, hanya akan mengembalikan satu dokumen. Rekod khusus yang dikembalikan akan dipilih sesuai dengan urutan semula jadi (urutan di mana dokumen disimpan dalam pangkalan data).

3.3. cari

cari memilih dokumen dari koleksi dan mengembalikan kursor ke dokumen yang dipilih.

Andaikan kita mempunyai pangkalan data berikut, yang mengandungi 2 rekod:

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

Sekiranya kita menggunakan GridFsTemplate untuk melaksanakan pertanyaan berikut:

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

Senarai yang dihasilkan harus mengandungi dua rekod kerana kami tidak memberikan kriteria.

Kami tentu saja dapat memberikan beberapa kriteria untuk kaedah mencari . Sebagai contoh, jika kita ingin mendapatkan fail yang metadata mengandungi pengguna dengan nama alex , kodnya adalah:

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

Senarai yang dihasilkan hanya akan mengandungi satu rekod.

3.4. padam

hapus membuang dokumen dari koleksi.

Dengan menggunakan pangkalan data dari contoh sebelumnya, anggaplah kita mempunyai kod:

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

Setelah melaksanakan hapus , hanya satu rekod yang tersisa di pangkalan data:

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

dengan ketulan:

{ "_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 mengembalikan semua GridFsResource dengan corak nama fail yang diberikan.

Andaikan kita mempunyai rekod berikut dalam pangkalan data:

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

Sekarang mari kita jalankan getResources menggunakan corak fail:

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

Ini akan mengembalikan dua rekod yang namanya dimulakan dengan "test" (dalam kes ini, keduanya diberi nama test.png ).

4. Kaedah Teras GridFSFile

The GridFSFile API adalah agak mudah juga:

  • getFilename - mendapat nama fail fail
  • getMetaData - mendapat metadata untuk fail yang diberikan
  • mengandungField - menentukan sama ada dokumen mengandungi medan dengan nama yang diberikan
  • get - mendapat medan dari objek dengan nama
  • getId - mendapat ID objek fail
  • keySet - mendapat nama medan objek

5. Kesimpulan

Dalam artikel ini kami melihat ciri GridFS MongoDB, dan bagaimana berinteraksi dengan mereka menggunakan Spring Data MongoDB.

Pelaksanaan semua contoh dan coretan kod ini boleh didapati di projek github saya - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.