Clase MongoGridFS

(PECL mongo >=0.9.0)

Introducción

Utilidad para almacenar y extraer ficheros de la base de datos.

GridFS es una especificación de almacenamiento que implementan todos los drivers soportados. En resumen, define dos colecciones: files, para los metadatos del fichero, y chunks, para el contenido del fichero. Si el fichero fuera de gran tamaño, automáticamente se dividiría en porciones menores, y cada bloque se guardará como un documento en la colección de bloques.

Cada documento de la colección de ficheros contiene el nombre de fichero, fecha de subida, y un código hash md5. También contiene un campo único _id, que se puede utilizar para consultar el contenido del fichero en la colección de bloques. Cada documento de la colección de bloques contiene un bloque de datos binarios, un campo files_id que se corresponde con el _id de su fichero, y la posición de este bloque respecto a los demás.

Por ejemplo, el documento de ficheros podría ser algo tal que así:

<?php
array("_id" => 123456789"filename" => "foo.txt""chunkSize" => 3"length" => 12);
?>
mientras que los documentos de bloques:
<?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"));
?>
Por supuesto, el tamaño por omisión de los bloques es de miles de bytes, pero eso lo haría un ejemplo impracticable.

Compatibilidad Entre Lenguajes

Se puede usar cualquier fichero creado con MongoGridFS con cualquier otro driver y viceversa. Sin embargo, algunos drivers esperan que todos los metadatos asociados con un fichero se encuentren en el campo "metadata". Si se preve que se utilizará con otros lenguajes, es una buena idea empaquetar en un campo "metadata" toda la información que se desee que vean. Por ejemplo, en lugar de:

<?php

$grid
->storeFile("algunfichero.txt", array("date" => new MongoDate()));

?>

utilice algo así:

<?php

$grid
->storeFile("algunfichero.txt", array("metadata" => array("date" => new MongoDate())));

?>

La Familia MongoGridFS

MongoGridFS representa los ficheros y las colecciones de bloques. MongoGridFS hereda MongoCollection. Las instancias de MongoGridFS tienen acceso a todos los métodos de MongoCollection, que actúan sobre las colecciones de ficheros:

<?php

$grid 
$db->getGridFS();
$grid->update(array("filename" => "foo"), $newObj); // actualización en la colección de ficheros

?>

Otro ejemplo de manipulación de metadatos:

<?php

// guardar un fichero
$id $grid->storeFile("juego.tgz");
$juego $grid->findOne();

// añadir un contador de descargas
$juego->file['descargas'] = 0;
$grid->save($juego->file);

// incrementar el contador
$grid->update(array("_id" => $id), array('$inc' => array("descargas" => 1)));

?>

Se puede también acceder a los bloques de una colección a partir de una instancia de MongoGridFS:

<?php

  $chunks 
$grid->chunks// $chunks es un MongoCollection normal
$chunks->insert(array("x" => 4));

?>

Hay algunos métodos de MongoGridFS que comparten nombres con métodos de MongoCollection, pero que se comportan de un modo ligeramente diferente. Por ejemplo, MongoGridFS::remove() eliminará cualquier objeto, junto con su contenido en la colección de bloques, cuando se cumplan los criterios de la colección de ficheros.

Para almacenar cualquier otra cosa en GridFS, hay varias opciones. Si se tuviera un nombre de fichero, se podría hacer:

<?php

$grid
->storeFile($filename, array("cualquier" => "metadato""que" => "desee"));

?>

Si se tuviera un string de bytes que no fuera un fichero, se podrá tambien almacenar usando MongoGridFS::storeBytes():

<?php

$grid
->storeBytes($bytes, array("cualquier" => "metadato""que" => "desee"));

?>

Al consultar a una colección MongoGridFS, se devolverá un MongoGridFSCursor, que se comporta como un MongoCursor convencional, excepto que devuelve un MongoGridFSFiles en lugar de una matriz asociativa.

MongoGridFSFiles puede volver a escribirse en disco usando MongoGridFSFile::write(), o en memoria usando MongoGridFSFile::getBytes(). Actualmente no existe ningún método que cree automáticamente un flujo de bloques, pero resulta muy sencillo hacer escrituras realizando consultas a la colección $grid->chunks.

El objeto MongoGridFSFile contiene un campo file (fichero) que contiene cualquier metadato del fichero.

Sinopsis de la Clase

extends MongoCollection {
/* Campos */
public MongoCollection $chunks = NULL ;
protected string $filesName = NULL ;
protected string $chunksName = NULL ;
/* Métodos */
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
}

Ver también

Tabla de contenidos