1. Tổng quan
Hướng dẫn này sẽ khám phá một trong những tính năng cốt lõi của Spring Data MongoDB:tương tác với GridFS .
Thông số lưu trữ GridFS chủ yếu được sử dụng để làm việc với các tệp vượt quá BSON -giới hạn kích thước tài liệu là 16MB. Và Spring Data cung cấp một GridFsOperations giao diện và việc triển khai nó - GridFsTemplate - để dễ dàng tương tác với hệ thống tệp này.
2. Cấu hình
2.1. Cấu hình XML
Hãy bắt đầu với cấu hình XML đơn giản cho GridFsTemplate :
<bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate">
<constructor-arg ref="mongoDbFactory" />
<constructor-arg ref="mongoConverter" />
</bean>
Các đối số của hàm tạo cho GridFsTemplate bao gồm các tham chiếu bean tới mongoDbFactory , tạo cơ sở dữ liệu Mongo và mongoConverter , chuyển đổi giữa các kiểu Java và MongoDB. Dưới đây là định nghĩa về bean của họ.
<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. Cấu hình Java
Hãy tạo một cấu hình tương tự, chỉ với 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);
}
// ...
}
Đối với cấu hình này, chúng tôi đã sử dụng mongoDbFactory () và tự động nối dây M appingMongoConverter được định nghĩa trong lớp cha AbstractMongoClientConfiguration .
3. GridFsTemplate Phương pháp cốt lõi
3.1. cửa hàng
Cửa hàng phương thức lưu tệp vào MongoDB.
Giả sử chúng ta có một cơ sở dữ liệu trống và muốn lưu trữ một tệp trong đó:
InputStream inputStream = new FileInputStream("src/main/resources/test.png");
gridFsTemplate.store(inputStream, "test.png", "image/png", metaData).toString();
Lưu ý rằng chúng tôi có thể lưu siêu dữ liệu bổ sung cùng với tệp bằng cách chuyển một DBObject đến cửa hàng phương pháp. Ví dụ của chúng tôi, DBObject có thể trông giống như sau:
DBObject metaData = new BasicDBObject();
metaData.put("user", "alex");
GridFS sử dụng hai bộ sưu tập để lưu trữ siêu dữ liệu tệp và nội dung của nó. Siêu dữ liệu của tệp được lưu trữ trong tệp bộ sưu tập và nội dung của tệp được lưu trữ trong phần thu thập. Cả hai bộ sưu tập đều có tiền tố là fs .
Nếu chúng tôi thực thi lệnh MongoDB db [‘fs.files ']. Find () , chúng ta sẽ thấy fs.files bộ sưu tập:
{
"_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"
}
Lệnh db [‘fs.chunks ']. Find () truy xuất nội dung của tệp:
{
"_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 trả về chính xác một tài liệu đáp ứng các tiêu chí truy vấn đã chỉ định.
String id = "5602de6e5d8bba0d6f2e45e4";
GridFSFile gridFsFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));
Đoạn mã trên sẽ trả về bản ghi kết quả đã được thêm vào trong ví dụ trên. Nếu cơ sở dữ liệu chứa nhiều hơn một bản ghi phù hợp với truy vấn, nó sẽ chỉ trả về một tài liệu. Bản ghi cụ thể được trả về sẽ được chọn theo thứ tự tự nhiên (thứ tự lưu trữ tài liệu trong cơ sở dữ liệu).
3.3. tìm thấy
tìm thấy chọn tài liệu từ một bộ sưu tập và trả lại con trỏ đến các tài liệu đã chọn.
Giả sử chúng ta có cơ sở dữ liệu sau, chứa 2 bản ghi:
[
{
"_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"
}
]
Nếu chúng tôi sử dụng GridFsTemplate để thực hiện truy vấn sau:
List<GridFSFile> fileList = new ArrayList<GridFSFile>();
gridFsTemplate.find(new Query()).into(fileList);
Danh sách kết quả phải chứa hai bản ghi vì chúng tôi không cung cấp tiêu chí.
Tất nhiên, chúng tôi có thể cung cấp một số tiêu chí cho tìm thấy phương pháp. Ví dụ:nếu chúng tôi muốn lấy các tệp có siêu dữ liệu chứa người dùng có tên alex , mã sẽ là:
List<GridFSFile> gridFSFiles = new ArrayList<GridFSFile>();
gridFsTemplate.find(new Query(Criteria.where("metadata.user").is("alex"))).into(gridFSFiles);
Danh sách kết quả sẽ chỉ chứa một bản ghi.
3.4. xóa
xóa xóa tài liệu khỏi bộ sưu tập.
Sử dụng cơ sở dữ liệu từ ví dụ trước, giả sử chúng ta có mã:
String id = "5702deyu6d8bba0d6f2e45e4";
gridFsTemplate.delete(new Query(Criteria.where("_id").is(id)));
Sau khi thực hiện xóa , chỉ có một bản ghi còn lại trong cơ sở dữ liệu:
{
"_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"
}
với các khối:
{
"_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 trả về tất cả GridFsResource với mẫu tên tệp đã cho.
Giả sử chúng ta có các bản ghi sau trong cơ sở dữ liệu:
[
{
"_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"
}
]
Bây giờ, hãy thực thi getResources sử dụng mẫu tệp:
GridFsResource[] gridFsResource = gridFsTemplate.getResources("test*");
Thao tác này sẽ trả về hai bản ghi có tên tệp bắt đầu bằng “test” (trong trường hợp này, cả hai đều có tên là test.png ).
4. GridFSFile Phương pháp cốt lõi
GridFSFile API cũng khá đơn giản:
- getFilename - lấy tên tệp của tệp
- getMetaData - lấy siêu dữ liệu cho tệp đã cho
- Trường chứa - xác định xem tài liệu có chứa trường với tên đã cho không
- nhận được - lấy một trường từ đối tượng theo tên
- getId - lấy ID đối tượng của tệp
- keySet - lấy tên trường của đối tượng