GridFS di Spring Data MongoDB

1. Ikhtisar

Tutorial ini akan mengeksplorasi salah satu fitur inti dari Spring Data MongoDB: berinteraksi dengan GridFS .

Spesifikasi penyimpanan GridFS terutama digunakan untuk bekerja dengan file yang melebihi batas ukuran dokumen BSON sebesar 16MB. Dan Spring Data menyediakan antarmuka GridFsOperations dan implementasinya - GridFsTemplate - agar mudah berinteraksi dengan sistem file ini.

2. Konfigurasi

2.1. Konfigurasi XML

Mari kita mulai dengan konfigurasi XML sederhana untuk GridFsTemplate :

Argumen konstruktor ke GridFsTemplate menyertakan referensi kacang ke mongoDbFactory , yang membuat database Mongo, dan mongoConverter , yang mengonversi antara jenis Java dan MongoDB. Definisi kacang mereka ada di bawah.

2.2. Konfigurasi Java

Mari buat konfigurasi 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 metode mongoDbFactory () dan otomatis menghubungkan M appingMongoConverter yang ditentukan di kelas induk AbstractMongoClientConfiguration .

3. Metode Inti GridFsTemplate

3.1. toko

The toko Metode menyimpan file ke dalam MongoDB.

Misalkan kita memiliki database kosong dan ingin menyimpan file di dalamnya:

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

Perhatikan bahwa kita dapat menyimpan metadata tambahan bersama dengan file tersebut dengan meneruskan DBObject ke metode penyimpanan . Untuk contoh kami, DBObject mungkin terlihat seperti ini:

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

GridFS menggunakan dua koleksi untuk menyimpan metadata file dan isinya. Metadata file disimpan dalam koleksi file , dan konten file disimpan dalam koleksi potongan . Kedua koleksi diawali dengan fs .

Jika kita menjalankan perintah MongoDB db ['fs.files']. Find () , 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 konten file:

{ "_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 mengembalikan tepat satu dokumen yang memenuhi kriteria kueri yang ditentukan.

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

Kode di atas akan mengembalikan record hasil yang ditambahkan pada contoh di atas. Jika database berisi lebih dari satu record yang cocok dengan kueri, itu hanya akan mengembalikan satu dokumen. Catatan spesifik yang dikembalikan akan dipilih sesuai dengan urutan alami (urutan dokumen disimpan dalam database).

3.3. Temukan

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

Misalkan kita memiliki database berikut, yang berisi 2 record:

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

Jika kita menggunakan GridFsTemplate untuk mengeksekusi query berikut:

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

Daftar yang dihasilkan harus berisi dua rekaman karena kami tidak memberikan kriteria.

Kami tentu saja dapat memberikan beberapa kriteria untuk metode pencarian . Misalnya, jika kita ingin mendapatkan file yang metadatanya berisi pengguna dengan nama alex , kodenya adalah:

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

Daftar yang dihasilkan hanya akan berisi satu record.

3.4. menghapus

delete menghapus dokumen dari koleksi.

Menggunakan database dari contoh sebelumnya, misalkan kita memiliki kode:

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

Setelah menjalankan delete , hanya satu record yang tersisa di database:

{ "_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 potongan:

{ "_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 pola nama file yang diberikan.

Misalkan kita memiliki record berikut di database:

[ { "_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 jalankan getResources menggunakan pola file:

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

Ini akan mengembalikan dua record yang nama filenya dimulai dengan "test" (dalam hal ini, keduanya dinamai test.png ).

4. Metode Inti GridFSFile

The GridFSFile API cukup sederhana juga:

  • getFilename - mendapatkan nama file dari file tersebut
  • getMetaData - mendapatkan metadata untuk file yang diberikan
  • containsField - menentukan apakah dokumen berisi bidang dengan nama yang diberikan
  • get - mendapatkan field dari objek dengan nama
  • getId - mendapatkan ID objek file
  • keySet - mendapatkan nama bidang objek

5. Kesimpulan

Pada artikel ini kita melihat fitur GridFS dari MongoDB, dan bagaimana berinteraksi dengannya menggunakan Spring Data MongoDB.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek github saya - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.