如何使用Lithium和GridFS在不同的集合中存储不同类型的文件?

时间:2012-09-15 23:29:41

标签: php mongodb gridfs lithium

我的模型看起来像这样:

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;
    }
}

静态函数获取zip存档的全名和存档中文件的名称,创建模型,从存档文件加载内容,设置一些元数据并返回模型。这用于我正在编写的控制台命令,它将遍历一个zip文件列表,每个文件包含一堆pdfs,并将pdf添加到数据库中。

当我保存模型时,pdf确实会添加到数据库中。我可以从MongoDB控制台查看所有pdf,即db.fs.files.find()。我也可以使用mongofiles命令从数据库中获取pdf。

然而,如果不是将ffs文件保存在fs.files下,它将真的很好,我可以将它们存储在fs.files.pdfs下。这是因为我还计划在同一个数据库中存储jpeg和文本文档。

如果我将类中的$ _meta更改为array('source' => 'fs.files.pdfs'),我的控制台命令似乎输出将pdf文档发送到终端而不是添加它(随便,我想知道为什么锂会这样做!)

我检查了文档,但无法弄清楚我做错了什么。有没有办法让Lithium根据所使用的型号将我的文件存储在不同的集合中?

(如果我的术语不准确,我很抱歉;这是我第一次尝试在基本教程之外使用Lithium和MongoDB。)

2 个答案:

答案 0 :(得分:2)

  

但是,如果不将ffs文件保存在fs.files下,我可以将它们存储在fs.files.pdfs下,这真的很好。这是因为我还计划将jpeg和文本文档存储在同一个数据库中。

目前,您无法为来源fs.files.pdfs命名,但pdfs.filesphotos.files ...

  

我检查了文档,但无法弄清楚我做错了什么。有没有办法让Lithium根据所使用的型号将我的文件存储在不同的集合中?

请点击此处突出显示的行:https://github.com/UnionOfRAD/lithium/blob/master/data/source/MongoDb.php#L387-390

以下是Lithium如何处理

答案 1 :(得分:0)

是的,我相信我们在IRC上讨论了这个问题。这是MongoDB的限制,我不相信你可以拥有多个GridFS前缀(如果我错了,有人会纠正我。)

如果你只想找到一种通过不同模型操作不同文件类型的方法,我建议创建单独的模型,然后在条件中修改他们的default queries以包含'type' => 'pdf',或者某事沿着这些路线。