GridFS в Spring Data MongoDB
В этом руководстве будет рассмотрена одна из основных функций Spring Data MongoDB: взаимодействие с GridFS .
Спецификация хранилища GridFS в основном используется для работы с файлами, размер которых превышает предельный размер документа BSON , равный 16 МБ. А Spring Data предоставляет интерфейс GridFsOperations и его реализацию — GridFsTemplate — для простого взаимодействия с этой файловой системой.
2. Конфигурация
2.1. XML-конфигурация
Начнем с простой конфигурации XML для GridFsTemplate :
bean id="gridFsTemplate" class="org.springframework.data.mongodb.gridfs.GridFsTemplate"> constructor-arg ref="mongoDbFactory" /> constructor-arg ref="mongoConverter" /> bean>
Аргументы конструктора для GridFsTemplate включают ссылки bean-компонента на mongoDbFactory , который создает базу данных Mongo, и mongoConverter , который выполняет преобразование между типами Java и MongoDB. Их определения бобов приведены ниже.
mongo:db-factory id="mongoDbFactory" dbname="test" mongo-client-ref="mongoClient" /> mongo:mapping-converter id="mongoConverter" base-package="com.foreach.converter"> mongo:custom-converters base-package="com.foreach.converter"/> /mongo:mapping-converter>
2.2. Конфигурация Java
Создадим аналогичную конфигурацию, только с Java:
@Configuration @EnableMongoRepositories(basePackages = "com.foreach.repository") public class MongoConfig extends AbstractMongoClientConfiguration @Autowired private MappingMongoConverter mongoConverter; @Bean public GridFsTemplate gridFsTemplate() throws Exception return new GridFsTemplate(mongoDbFactory(), mongoConverter); > // . >
Для этой конфигурации мы использовали метод mongoDbFactory() и автоматически подключили M appingMongoConverter, определенный в родительском классе AbstractMongoClientConfiguration .
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 использует две коллекции для хранения метаданных файла и его содержимого. Метаданные файла хранятся в коллекции файлов , а содержимое файла хранится в коллекции фрагментов . Обе коллекции имеют префикс 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 возвращает ровно один документ, удовлетворяющий заданным критериям запроса.
String id = "5602de6e5d8bba0d6f2e45e4"; GridFSFile gridFsFile = gridFsTemplate.findOne(new Query(Criteria.where("_id").is(id)));
Приведенный выше код вернет запись результата, которая была добавлена в приведенном выше примере. Если база данных содержит более одной записи, соответствующей запросу, будет возвращен только один документ. Возвращаемая конкретная запись будет выбрана в соответствии с естественным порядком (порядком, в котором документы хранились в базе данных).
3.3. найти
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 для выполнения следующего запроса:
ListGridFSFile> fileList = new ArrayListGridFSFile>(); gridFsTemplate.find(new Query()).into(fileList);
Результирующий список должен содержать две записи, поскольку мы не указали никаких критериев.
Конечно, мы можем указать некоторые критерии для метода поиска . Например, если мы хотим получить файлы, метаданные которых содержат пользователей с именем alex , код будет таким:
ListGridFSFile> gridFSFiles = new ArrayListGridFSFile>(); gridFsTemplate.find(new Query(Criteria.where("metadata.user").is("alex"))).into(gridFSFiles);
Результирующий список будет содержать только одну запись.
3.4. Удалить
delete удаляет документы из коллекции.
Используя базу данных из предыдущего примера, предположим, что у нас есть код:
String id = "5702deyu6d8bba0d6f2e45e4"; gridFsTemplate.delete(new Query(Criteria.where("_id").is(id)));
После выполнения delete в базе данных остается только одна запись:
"_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 возвращает все 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" : "foreach" >, "filename" : "foreach.png", "aliases" : null, "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2015-09-23T17:16:30.781Z"), "length" : NumberLong(855), "contentType" : "image/png", "md5" : "27c915db9aa031f1b27bb05021b695c6" >
Использование GridFS ¶
Расширение поддерживает MongoGridFS с помощью классов из пространства имен «\yii\mongodb\file». Там вы найдете классы Collection, Query и ActiveRecord.
Вы можете загрузить файл с помощью yii\mongodb\file\Upload:
$document = Yii::$app->mongodb->getFileCollection()->createUpload() ->addContent('Part 1') ->addContent('Part 2') // . ->complete();
Вы можете скачать файл с помощью yii\mongodb\file\Download:
Yii::$app->mongodb->getFileCollection()->createDownload($document['_id'])->toFile('/path/to/file.dat');
Каждая строка, файла результата запроса, содержит ключ ‘file’ экземпляра yii\mongodb\file\Download:
use yii\mongodb\file\Query; $query = new Query(); $rows = $query->from('fs') ->limit(10) ->all(); foreach ($rows as $row) < var_dump($row['file']); // вывод: "object(\yii\mongodb\file\Download)" echo $row['file']->toString(); // содержание файла вывода >
С помощью [\yii\mongodb\file\ActiveRecord]] вы можете манипулировать файлами используя свойство ‘file’:
use yii\mongodb\file\ActiveRecord; class ImageFile extends ActiveRecord < //. > $record = new ImageFile(); $record->number = 15; $record->file = '/path/to/some/file.jpg'; // локальная загрузка файла GridFS $record->save(); $record = ImageFile::find()->where(['number' => 15])->one(); var_dump($record->file); // вывод: "object(\yii\mongodb\file\Download)" echo $record->file->toString(); // содержание файла вывода
Вы также можете управлять файлами GridFS через регулярные потоки ресурсов PHP. Вам нужно будет зарегистрировать обертку потока предоставленную этим расширением — yii\mongodb\file\StreamWrapper. Это может быть сделано с помощью \yii\mongodb\file\Connection::registerFileStreamWrapper() . После того как обертка потока зарегистрирована, вы можете открыть поток используя следующий формат:
'protocol://databaseName.fileCollectionPrefix?file_attribute=value'
Yii::$app->mongodb->registerFileStreamWrapper(); // register stream wrapper // запись файла: $resource = fopen('gridfs://mydatabase.fs?filename=new_file.txt', 'w'); fwrite($resource, 'some content'); // . fclose($resource); // запись файла с несколькими полями: $resource = fopen('gridfs://mydatabase.fs?filename=new_file.txt&number=17&status=active', 'w'); fwrite($resource, 'file number 17 with status "active"'); fclose($resource); // чтение файла: $resource = fopen('gridfs://mydatabase.fs?filename=my_file.txt', 'r'); $fileContent = stream_get_contents($resource);
MongoDB – GridFS
GridFS – это спецификация MongoDB для хранения и извлечения больших файлов, таких как изображения, аудиофайлы, видеофайлы и т. Д. Это своего рода файловая система для хранения файлов, но ее данные хранятся в коллекциях MongoDB. GridFS имеет возможность хранить файлы даже больше, чем его ограничение размера документа 16 МБ.
GridFS делит файл на куски и сохраняет каждый кусок данных в отдельном документе, каждый из которых имеет максимальный размер 255 КБ.
GridFS по умолчанию использует две коллекции fs.files и fs.chunks для хранения метаданных файла и фрагментов. Каждый блок идентифицируется уникальным полем _id ObjectId. Файл fs.files является родительским документом. Поле files_id в документе fs.chunks связывает чанк с его родителем.
Ниже приведен пример документа коллекции fs.files –
"filename": "test.txt", "chunkSize": NumberInt(261120), "uploadDate": ISODate("2014-04-13T11:32:33.557Z"), "md5": "7b762939321e146569b07f72c62cca4f", "length": NumberInt(646) >
В документе указывается имя файла, размер фрагмента, дата загрузки и длина.
Ниже приведен пример документа fs.chunks –
"files_id": ObjectId("534a75d19f54bfec8a2fe44b"), "n": NumberInt(0), "data": "Mongo Binary Data" >
Добавление файлов в GridFS
Теперь мы будем хранить mp3-файл, используя GridFS, используя команду put . Для этого мы будем использовать утилиту mongofiles.exe, которая находится в папке bin установочной папки MongoDB.
Откройте командную строку, перейдите к файлу mongofiles.exe в папке bin установочной папки MongoDB и введите следующий код –
>mongofiles.exe -d gridfs put song.mp3
Здесь gridfs – это имя базы данных, в которой будет храниться файл. Если база данных отсутствует, MongoDB автоматически создаст новый документ на лету. Song.mp3 – это имя загруженного файла. Чтобы просмотреть документ файла в базе данных, вы можете воспользоваться поиском запроса –
>db.fs.files.find()
Приведенная выше команда вернула следующий документ –
_id: ObjectId('534a811bf8b4aa4d33fdf94d'), filename: "song.mp3", chunkSize: 261120, uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41", length: 10401959 >
Мы также можем увидеть все фрагменты, присутствующие в коллекции fs.chunks, связанные с сохраненным файлом, со следующим кодом, используя идентификатор документа, возвращенный в предыдущем запросе:
>db.fs.chunks.find(files_id:ObjectId('534a811bf8b4aa4d33fdf94d')>)
В моем случае запрос вернул 40 документов, а это означает, что весь mp3-документ был разделен на 40 блоков данных.
Gridfs что это
Для хранения больших объемов информации, в частности, файлов, в MongoDB используется система GridFS . Для работы с ней прежде всего необходимо дополнительно установить через Nuget пакет MongoDB.Driver.GridFS :

Для сохранения и получения из бд файлов, необходимо получить объект GridFS, определенный у базы данных. И для этого надо создать объект IGridFSBucket , определенный в пространстве имен MongoDB.Driver.GridFS . Для его создания можно использовать конструктор класса GridFSBucket , в который передается объект базы данных:
using MongoDB.Driver; using MongoDB.Driver.GridFS; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); IGridFSBucket gridFS = new GridFSBucket(db);
Класс GridFSBucket предоставляет функциональность по управлению хранилищем, в частности, по добавлению, изменению и удалению файлов.
Сохранение файлов в базу данных
Для добавления файлов в GridFS используется ряд методов, которые позволяют загружать либо данные из потока, либо массив байтов:
- UploadFromBytes/UploadFromBytesAsync : загружает файл в GridFS в виде массива байтов.
- UploadFromStream/UploadFromStreamAsync : получает данные из потока
Например, загрузим файл с локальной машины в хранилище:
using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.GridFS; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); IGridFSBucket gridFS = new GridFSBucket(db); // создаем поток из файла using Stream fs = File.OpenRead("D:\\cats.jpg"); // сохраняем в бд ObjectId gridFS.UploadFromStreamAsync("cats.jpg", fs); Console.WriteLine($"id файла: ");
С помощью метода File.OpenRead() создаем объект FileStream — файловый поток, а затем этот поток передается в метод gridFS.UploadFromStreamAsync() в качестве второго параметра. Первый параметр метода — имя файла — произвольный идентификатор. Метод возвращает id добавленного файла в GridFS в виде объекта ObjectId.
Если мы посмотрим содержание базы данных через MongoDBAtlas, то сможем увидеть в коллекции fs.files информацию о сохраненном файле:

Чтение файлов из GridFS
Для загрузки файла из GridFS также применяется ряд методов в зависимости от того, во что мы загружаем файл — в массив байтов или в поток:
- DownloadToStream/DownloadToStreamAsync : загрузка файла по id из GridFS в поток
- DownloadAsBytes/DownloadAsBytesAsync : загрузка файла по id в виде массива байтов
- DownloadToStreamByName/DownloadToStreamByNameAsync : загрузка файла по имени из GridFS в поток
- DownloadAsBytesByName/DownloadAsBytesByNameAsync : загрузка файла по id в виде массива байтов
Первые две пары методов в качестве первого параметра принимают id файла, который был присвоен при загрузке в GridFS. Третья пара методов загружает файла по имени. И четвертая пара методов загружает файл в виде массива байтов.
Извлечем ранее загруженный в GridFS файл:
using MongoDB.Driver; using MongoDB.Driver.GridFS; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); IGridFSBucket gridFS = new GridFSBucket(db); // создаем поток из файла using Stream fs = File.OpenWrite("D:\\new_cats.jpg"); // извлекаем из бд в поток await gridFS.DownloadToStreamByNameAsync("cats.jpg", fs);
В первом примере при загрузке в GridFS файлу было присвоено имя «cats.jpg». Теперь мы поэтому имени наоборот извлекаем файл из GridFS. Извлеченный файл передается в поток и сохраняется на диске D под именем «cats_new.jpg».
Подобным образом мы можем использовать перегрузки метода и загрузить файл, по определенному id. Например, загрузка по имени в массив байтов:
byte[] fileBytes = await gridFS.DownloadAsBytesByNameAsync("cats.jpg");
Загрузка по id в массив байтов:
byte[] fileBytes = await gridFS.DownloadAsBytesAsync(new ObjectId("635c2139a03205d6b1c9a88d"));
Загрузка по id в поток:
using Stream fs = File.OpenWrite("D:\\new_cats2.jpg"); await gridFS.DownloadToStreamAsync(new ObjectId("635c2139a03205d6b1c9a88d"), fs);
Поиск файла
С помощью методов Find/FindAsync мы можем найти файл в GridFS, а точнее получить различные его свойства. В качестве параметра эти методы принимают объект FilterDefinition , который определяет критерии поиска.
Результатом методов Find/FindAsync является объект IAsyncCursor — список информации о файлах. Используя объект GridFSFileInfo, мы можем извлечь информацию о файле с помощью ряда его свойств:
- Id : идентификатор файла
- Filename : имя файла
- UploadDateTime : дата и время загрузки файла (в виде объекта DateTime) файла
- Length : длина файла в байтах
- BackingDocument : документ BsonDocument, который представляет данный файл
- ChunkSizeBytes : размер одного чанка файла в байтах
Например, найдем информацию по ранее добавленному файлу cats.jpg:
using MongoDB.Driver; using MongoDB.Driver.GridFS; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); IGridFSBucket gridFS = new GridFSBucket(db); // создаем фильтр для поиска var filter = Builders.Filter.Eq(info => info.Filename, "cats.jpg"); // находим все файлы var fileInfos = await gridFS.FindAsync(filter); // получаем первый файл var fileInfo = fileInfos.FirstOrDefault(); // выводим его id Console.WriteLine($"id = \nName: \n" + $"UploadDateTime: \nSize: "); Console.WriteLine(fileInfo?.BackingDocument);
Фильтр для поиска создается тем же образом, что и фильтр для выборки из обычной базы данных MongoDB. При поиске мы указываем, по какому критерию надо находить файлы. В данном случае в качестве критерия используется имя файла. Информацию о файле представляет класс GridFSFileInfo, а имя файла хранится в его свойстве Filename, которое представляет строку. В метод Eq в качестве первого параметра передается метод, который возвращает свойство Filename. А второй параметр представляет значение, которое должно иметь это свойство.
Необязательно искать именно по имени файла. Можно было взять любое свойство класса GridFSFileInfo в качестве критерия.
По одному и тому же критерию в бд может находиться несколько файлов, поэтому метод Find фактически возвращает набор, из которого мы можем получить отдельные объекты GridFSFileInfo и их свойства. Так, в моем случае я получу следующий консольный вывод:
id = 635c2139a03205d6b1c9a88d Name: cats.jpg UploadDateTime: 28.10.2022 18:36:42 Size: 4043989
Замена файла
Для замены файла надо повторно его загрузить с помощью одного из методов UploadXXX и при загрузке указать параметр замены. Например, заменим файл по id:
using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.GridFS; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); IGridFSBucket gridFS = new GridFSBucket(db); using FileStream fs = File.OpenRead("D:\\forest.jpg"); var gridFS.UploadFromStreamAsync( "cats.jpg", fs, new GridFSUploadOptions < Metadata = new BsonDocument("filename", "cats.jpg") >); Console.WriteLine($"Файл заменен. Id файла: ");
Для замены в метод UploadFromStreamAsync передается объект GridFSUploadOptions , который описывает дополнительные опции загрузки. В частности, его свойство Metadata указывает на критерий замены. В данном случае замена будет производиться для файлов, у которых поле «filename» равно «cats.jpg».
Удаление файлов
Для удаления файла используются методы Delete/DeleteAsync , которые удаляют файл по id:
Например, удалим ранее сохраненный файл:
using MongoDB.Driver; using MongoDB.Driver.GridFS; MongoClient client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("test"); IGridFSBucket gridFS = new GridFSBucket(db); var filter = Builders.Filter.Eq(info => info.Filename, "cats.jpg"); // находим все файлы по имени "cats.jpg" var fileInfos = await gridFS.FindAsync(filter); // получаем первый файл var fileInfo = fileInfos.FirstOrDefault(); // если файл найден, удаляем его if(fileInfo!= null) await gridFS.DeleteAsync(fileInfo.Id);