2012-09-15 2 views
0

J'ai un modèle qui ressemble à ceci:Comment stocker des fichiers de différents types dans des collections séparées en utilisant Lithium et GridFS?

class Pdf extends \lithium\data\Model 
{ 

    protected $_meta = array('source' => 'fs.files'); 
    protected $_schema = array('_id'=>array('type'=>'id')); 

    public $file; 

    /** 
    * @param $zipfile string The full name and path of a zip file 
    * @param $filename string 
    */ 
    public static function loadFromFile($zipfile, $filename){ 
     $name = 'zip://'.$zipfile.'#'.$filename; 
     $pdf = Pdf::create(); 
     $pdf->file = file_get_contents($name); 
     $pdf->filename = $filename; 
     $pdf->metadata = ["filename" => $filename, "zipfile" => $zipfile]; 
     return $pdf; 
    } 
} 

La fonction statique prend le nom complet d'une archive zip et le nom d'un fichier dans l'archive, crée un modèle, charge le contenu du fichier archivé, définit des métadonnées et renvoie le modèle. Ceci est utilisé dans une commande de console que j'écris qui va itérer à travers une liste de fichiers zip, chacun contenant un tas de pdfs, et ajouter le pdfs à la base de données.

Lorsque je sauvegarde le modèle, le pdf est ajouté à la base de données. Je peux voir tous les fichiers PDF de la console MongoDB, c'est-à-dire avec db.fs.files.find(). Je peux aussi obtenir un pdf de la base de données en utilisant la commande mongofiles.

Cependant, il serait vraiment être gentil si au lieu de stocker le pdfs sous fs.files je pourrais les stocker sous fs.files.pdfs. C'est parce que je prévois de stocker également des jpegs et des documents texte dans la même base de données.

Si je change _meta $ dans la classe à array('source' => 'fs.files.pdfs'), ma commande de la console semble sortie le document pdf au terminal au lieu de l'ajouter (désinvolture, je voudrais savoir pourquoi Lithium fait ça!)

J'ai vérifié la documentation et n'ai pas été capable de comprendre ce que je fais mal. Existe-t-il un moyen pour que Lithium stocke mes fichiers dans des collections distinctes en fonction du modèle utilisé?

(Mes excuses si ma terminologie est inexact, ce qui est ma première tentative d'utilisation de lithium et MongoDB au-delà des tutoriels de base.)

+0

FYI, la terminologie [GridFS] (http://www.mongodb.org/display/DOCS/GridFS+Specification#GridFSSpecification-Specification) pour ceci est un "espace de noms". – Stennie

Répondre

2

Cependant, il serait vraiment bien si au lieu de stocker les pdfs sous fs .files je pourrais les stocker sous fs.files.pdfs. C'est parce que je prévois de stocker également des jpegs et des documents texte dans la même base de données.

En ce moment, vous ne pouvez pas nommer source fs.files.pdfs, mais pdfs.files et photos.files ...

J'ai vérifié la documentation et n'ont pas été en mesure de comprendre ce que je Je fais mal. Existe-t-il un moyen pour que Lithium stocke mes fichiers dans des collections distinctes en fonction du modèle utilisé?

Jetez un oeil aux lignes soulignées ici: https://github.com/UnionOfRAD/lithium/blob/master/data/source/MongoDb.php#L387-390

Voici comment gère au lithium qui

0

Oui, je crois que nous en avons discuté sur IRC. C'est une limitation de MongoDB, et je ne crois pas que vous pouvez avoir plus d'un préfixe GridFS (quelqu'un me corrige si je me trompe).

Si vous cherchez simplement un moyen de manipuler différents types de fichiers via différents modèles, je vous recommande de créer des modèles séparés, puis de modifier leur default queries pour inclure 'type' => 'pdf' dans les conditions, ou quelque chose du genre.

+0

Par mon commentaire sur la question initiale, GridFS autorise plusieurs préfixes ou * espaces de noms *. "Pour créer plus d'un espace de noms GridFS pour une seule base de données, les collections de fichiers et de morceaux sont nommées avec un préfixe: Par défaut, le préfixe est fs., Donc tout magasin GridFS par défaut sera constitué de collections nommées fs.files et fs Les pilotes permettent de changer ce préfixe, ainsi vous pouvez, par exemple, avoir un autre espace de noms GridFS spécifique aux photos où les collections seraient photos.files et photos.chunks. " – Stennie

+0

Ah, c'est vrai. Désolé de ne pas avoir lu votre question d'origine plus attentivement. Je suppose que nous devrons patcher l'adaptateur. Pouvez-vous ouvrir un problème dans GitHub et créer un lien vers ce sujet? –

+0

Est-ce que cela a été corrigé depuis? J'ai deux modèles séparés que je voudrais stocker dans des collections indépendantes de GridFS. Ajouter 'protected $ _meta = array ('source' => 'photos.files');' crée automatiquement la collection 'photos.files', mais les morceaux finissent par être sacrés (peut-être nulle part). –

Questions connexes