Gridfs что это
Перейти к содержимому

Gridfs что это

  • автор:

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 в MongoDB и C#

Для сохранения и получения из бд файлов, необходимо получить объект 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 информацию о сохраненном файле:

Сохранение файлов в MongoDB и GridFS

Чтение файлов из 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);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *