MongoDB stocke les données dans des documents qui ne dépassent pas 16MB, alors comment faire si nos données dépassent cette taille? MongoDB nous offre  Gridfs; Il s’agit d’une spécification pour stocker et récupérer les fichiers qui dépassent la taille limite 16MB.

Au lieu de stocker le fichier dans un seul document, Gridfs divise le fichier en deux parties (chunks) et stocke chaque partie dans un document à part. Pour cela, Gridfs utilise deux collections pour stocker les fichiers:

  • « files« :  Pour les méta-données du fichier.
  • « chunks« : Pour le contenu du fichier.
  • Pour vous donner une idée, la collection chunks divise le fichier sur plusieurs documents.

Gridfs est utile non seulement pour stocker des fichiers qui dépassent 16MB, mais aussi pour stocker tous les fichiers que vous souhaitez pour un accès sans charger tout le fichier en mémoire.

Ci-dessous un exemple illustrant la structure des deux collections:

La collection files

{
  "_id" : ,
  "length" : ,
  "chunkSize" : 
  "uploadDate" : 
  "md5" : 

  "filename" : ,
  "contentType" : ,
  "aliases" : ,
  "metadata" : ,
}

La collection chunks

{
  "_id" : ,
  "files_id" : ,
  "n" : ,
  "data" : 
}

Pour plus de détail consultez le lien: http://docs.mongodb.org/manual/reference/gridfs/

Pour vous donner une idée, la collection chunks divise le fichier sur plusieurs documents.

Nous allons voir un exemple d’insertion d’un fichier  dans MongoDB, via PHP, à base du code de l’article 

class TrainingClass {

      public $mongo;
      public $db;
      public $collection;
      /*Here Constructor is use to establish the database connection, when Object of the class will create it will call automatically*/
        function __construct() {
	        $this->mongo = new Mongo();
		// Select base de données blog
		$this->db = $this->mongo->test;
		// Collection User
		$this->collection = $this->db->names;
	}

	public function fetchById($id) {
  		$query = array('_id' => new MongoId($id));
         	$result = $this->collection->findOne($query);
        	return $result;
       }
  }

  /*TEST MongoDB*/
  $trainingMongo = new TrainingClass;

  $item = $trainingMongo->collection->findOne();
  echo 'Salam '.$item['name'].'';
  echo '
************* GridFS *********************
';
  // GridFS Exemple
  $grid = $trainingMongo->db->getGridFS();
  // The file's location in the File System
  $filename = "Cours WordPress";
  $path = "E:\WORDPRESS\Livres\cours.pdf";
  // Note metadata field & filename field
  $storedfile = $grid->storeFile(
                    $path,
 		   array(
         		"metadata" => array("filename" => $filename),
			"filename" => $filename
			 )
		);
  // Return newly stored file's Document ID
  echo $storedfile;

Après l’exécution du code, vous aurez dans la base de données ‘test’  les deux collections ajoutées files et chunks

collections

Si vous lancez la commande db.fs.files.find().pretty(), vous aurez comme suit :

db_files

la commande db.fs.chukns.find({}, {data: 0, _id: 0}) donne :

chukns

Nous remarquons bien que la valeur du champ files_id (ce qui est en rouge) fait référence au _id du document de la collection files.

Nous avons quelques notions de bases sur Gridfs et j’espère bien que vous pouvez maintenant commencer avec Gridfs tranquillement.

Voir aussi la commande mongofiles