(PECL mongo >=0.9.0)
Утилиты для хранения и извлечения файлов из базы данных.
GridFS - это спецификация хранилища, с которой работают все поддерживаемые драйверы.
По сути, она определяет две коллекции: files
для метаданных файла
и chunks
содержимого файла.
Если файл большой, он будет автоматически разбит на мелкие фрагменты,
и каждый фрагмент будет сохранен как документ в коллекции фрагментов.
Каждый документ в коллекции файлов содержит имя файла, дату загрузки и хэш md5.
Он также содержит уникальное поле _id
, которое можно использовать
для запроса к коллекции фрагментов содержимого файла.
Каждый документ в коллекции чанков содержит фрагмент двоичных данных,
поле files_id
, совпадающее с _id
его файла,
и положение этого фрагмента в общем файле.
Например, документы файлов выглядят примерно так:
<?php
array("_id" => 123456789, "filename" => "foo.txt", "chunkSize" => 3, "length" => 12);
?>
<?php
array("files_id" => 123456789, "n" => 0, "data" => new MongoBinData("abc"));
array("files_id" => 123456789, "n" => 1, "data" => new MongoBinData("def"));
array("files_id" => 123456789, "n" => 2, "data" => new MongoBinData("ghi"));
array("files_id" => 123456789, "n" => 3, "data" => new MongoBinData("jkl"));
?>
Должна быть возможность использовать любые файлы, созданные MongoGridFS с любыми другими драйверами, и наоборот. Однако некоторые драйверы ожидают, что все метаданные, связанные с файлом, будут в поле "metadata". Если вы собираетесь использовать другие языки, хорошей идеей будет поместить информацию, которую вы хотите, чтобы они видели в поле "metadata". Например, вместо:
<?php
$grid->storeFile("somefile.txt", array("date" => new MongoDate()));
?>
сделать так:
<?php
$grid->storeFile("somefile.txt", array("metadata" => array("date" => new MongoDate())));
?>
MongoGridFS представляет коллекции файлов и фрагментов. MongoGridFS расширяет MongoCollection, и экземпляр MongoGridFS имеет доступ ко всем методам MongoCollection, которые действуют на коллекцию файлов:
<?php
$grid = $db->getGridFS();
$grid->update(array("filename" => "foo"), $newObj); // обновление коллекции файлов
?>
Еще один пример манипулирования метаданными:
<?php
// сохраняем файл
$id = $grid->storeFile("game.tgz");
$game = $grid->findOne();
// добавляем счетчик загрузок
$game->file['downloads'] = 0;
$grid->save($game->file);
// увеличиваем значение счетчика
$grid->update(array("_id" => $id), array('$inc' => array("downloads" => 1)));
?>
Вы также можете получить доступ к коллекции фрагментов из экземпляра MongoGridFS:
<?php
$chunks = $grid->chunks; // $chunks – обычная коллекция MongoCollection
$chunks->insert(array("x" => 4));
?>
Есть некоторые методы для MongoGridFS с тем же именем, что и методы MongoCollection, которые ведут себя немного по-другому. Например, MongoGridFS::remove() удалит все объекты, которые соответствуют критериям, из коллекции файлов, а их содержимое - из коллекции фрагментов.
Чтобы сохранить что-то новое в GridFS, есть несколько вариантов. Если у вас есть имя файла, вы можете выполнить:
<?php
$grid->storeFile($filename, array("whatever" => "metadata", "you" => "want"));
?>
Если у вас есть строка байтов, которая не является файлом, вы также можете сохранить ее, используя MongoGridFS::storeBytes():
<?php
$grid->storeBytes($bytes, array("whatever" => "metadata", "you" => "want"));
?>
Запрос к коллекции MongoGridFS возвращает MongoGridFSCursor, который ведет себя, как обычный MongoCursor, за исключением того, что он возвращает MongoGridFSFiles вместо ассоциативных массивов.
MongoGridFSFiles могут быть записаны обратно на диск
с помощью MongoGridFSFile::write() или извлечены в память
с помощью MongoGridFSFile::getBytes().
В настоящее время не существует метода для автоматической потоковой передачи фрагментов,
но его было бы довольно просто написать, обратившись к коллекции $grid->chunks
.
Объекты MongoGridFSFile содержат поля файла, которые могут содержая любые метаданные.
NULL
;NULL
;$bytes
[, array $metadata
= array()
[, array $options
= array()
]] ) : mixed