2012-08-08 43 views
1

我有一個用戶文檔,需要使用GridFS爲該文檔創建多張圖片。我無法使用GridFS保存文件。GridFS使用Mongo ODM不起作用

這裏是我的用戶文檔:

namespace Main\UserBundle\Document; 

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
*@MongoDB\Document(db="mydb", collection="users") 
*/ 
class User 
{ 
    /** 
    * @MongoDB\Id 
    */ 
    protected $id; 


    /** @MongoDB\EmbedMany(targetDocument="Asset") */ 
    public $assets = array(); 

    public function __construct() 
    { 
     $this->assets = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 


    /** 
    * Get id 
    * 
    * @return id $id 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 



    /** 
    * Add assets 
    * 
    * @param Main\ClassifiedBundle\Document\Asset $assets 
    */ 
    public function addAsset(\Main\ClassifiedBundle\Document\Asset $asset) 
    { 
     $this->assets[] = $asset; 
    } 

    /** 
    * Get assets 
    * 
    * @return Doctrine\Common\Collections\Collection $assets 
    */ 
    public function getAsset() 
    { 
     return $this->assets; 
    } 

} 

這裏是我的資產文件:

namespace Main\UserBundle\Document; 
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 


/** @MongoDB\EmbeddedDocument */ 
    class Asset 
    { 
     /** 
     * @MongoDB\Id 
     */ 
     public $id; 


    /** @MongoDB\Field */ 
    public $name; 

    /** @MongoDB\File */ 
    public $file; 

    /** @MongoDB\Field */ 
    public $uploadDate; 

    /** @MongoDB\Field */ 
    public $length; 

    /** @MongoDB\Field */ 
    public $chunkSize; 

    /** @MongoDB\Field */ 
    public $md5; 

    public function getId() 
    { 
     return $this->id; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function getFile() 
    { 
     return $this->file; 
    } 

    public function setFile($file) 
    { 
     $this->file = $file; 
    } 

} 

現在在我的控制,我想做到以下幾點:

$dm = $this->get('doctrine.odm.mongodb.document_manager'); 
    $user = $dm->getRepository('MainUserBundle:User') 
    ->find(1); //I already have a user document with id 1 

    $asset = new Asset(); 
    $asset->setName('Test image'); 
    $asset->setFile($uploadedFile->getPathname()); //I have verified that this is a valid image 
    $user->addAsset($asset); 

    var_dump($user); 

    $dm->persist($user); 
    $dm->flush(); 

的我在日誌中看到的錯誤是:

MongoException: zero-length keys are not allowed, did you use $ with double quotes? (uncaught exception) 

我得到在以下位置:

myapp.com/vendor/doctrine-mongodb/lib/Doctrine/MongoDB/Collection.php line 203 

另外,不保存文檔。我錯過了什麼?我遵循了mongoodm網站上的所有步驟。 ??

+1

Jini:實際上已經意識到你的語法*應該*基於當前的文檔工作..所以刪除了我的答案。你是否首先嚐試使用單個圖像來確認它的作用?也許是支持多個嵌入式GridFS文件的錯誤。 – Stennie 2012-08-08 14:21:04

+0

是的,我現在將修改嘗試單個圖像,看看。感謝您花時間查看並驗證 – jini 2012-08-08 14:25:19

+0

您有沒有想過這個?如果你有問題,請發佈你的解決方案 – 2012-11-23 18:47:50

回答

0

在元數據

MongoException

您試圖 「拯救」 的一個關鍵錯誤。你通常不應該這樣做。 「」可能會混淆子對象訪問,並在內部被MongoDB使用。但是,如果您真的想要,可以在php.ini文件中將mongo.allow_empty_keys設置爲true以覆蓋此完整性檢查。如果您覆蓋此設置,強烈建議您將錯誤檢查設置爲嚴格以避免字符串插值錯誤。

例如:

$m = new MongoClient(); 
$gridfs = $m->selectDB('test')->getGridFS(); 

$metaData = array(
'' => 'value', // '' as key 
); 

$gridfs->storeUpload('pic', $metaData); 
0

看來,這是不可能的GridFS的文件存儲在與MongoDB的ODM的當前版本嵌入文檔。

您可以使用@ReferenceMany作爲解決方法。