Класс MongoGridFS

(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 представляет коллекции файлов и фрагментов. 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 содержат поля файла, которые могут содержая любые метаданные.

Обзор классов

extends MongoCollection {
/* Поля */
public MongoCollection $chunks = NULL ;
protected string $filesName = NULL ;
protected string $chunksName = NULL ;
/* Методы */
public __construct ( MongoDB $db [, string $prefix = "fs" [, mixed $chunks = "fs" ]] )
public delete ( mixed $id ) : bool|array
public drop ( void ) : array
public find ([ array $query = array() [, array $fields = array() ]] ) : MongoGridFSCursor
public findOne ([ mixed $query = array() [, mixed $fields = array() ]] ) : MongoGridFSFile
public get ( mixed $id ) : MongoGridFSFile
public put ( string $filename [, array $metadata = array() [, array $options = array() ]] ) : mixed
public remove ([ array $criteria = array() [, array $options = array() ]] ) : bool|array
public storeBytes ( string $bytes [, array $metadata = array() [, array $options = array() ]] ) : mixed
public storeFile ( string|resource $filename [, array $metadata = array() [, array $options = array() ]] ) : mixed
public storeUpload ( string $name [, array $metadata ] ) : mixed
}

Смотрите также

Содержание