2013-06-20 60 views
0

我有一個文件用戶包含參考一個嵌入文檔中Doctrine2和MongoDB

/** 
* @MongoDB\ReferenceOne(targetDocument="Image") 
*/ 
private $image; 

和文檔ImageCollection其嵌入文檔稱爲圖像

/** 
* @MongoDB\EmbedMany(targetDocument="Image") 
*/ 
private $images = array(); 

和我的嵌入文檔圖片包含一些通常的字段。這是我如何嘗試做的參考(上傳者是一些用戶的參考):

$rep = $this->dm->getRepository('Document\ImageCollection'); 
$qb = $rep->createQueryBuilder('Document\ImageCollection')->field('images.uploader.$id')->equals(new \MongoId($uploader->getId())); 
$query = $qb->getQuery(); // get query 
$result = $query->execute(); // do query 
$arr = $result->toArray(); // get array 
$item = array_shift($arr); // get first item of array 

$newUser = new Documents\User(); 
$newUser->setName('Bob King'); 
$newUser->setImage($item->getImages()[0]); 

結果將如下所示。問題是,我不知道爲什麼我的$ ref和$ db是正確的,而$ id爲空?

{ 
    "_id": ObjectID("51c2c357fa463404041b55ce"), 
    "name": "Bob King", 
    "image": { 
     "$ref": "Image", 
     "$id": null, 
     "$db": "db_users_and_images" 
    } 
} 

回答

1

問題是,您不能引用嵌入式文檔。您只能引用文檔。仔細閱讀MongoDB文檔中的Data Modeling Considerations,發現您必須在嵌入和引用之間進行選擇。

通常,當您只需要從其主文檔(單向多關係)訪問嵌入式文檔時,使用嵌入式文檔。如果您需要從多個位置(它屬於多個文檔)引用文檔或者單獨查詢文檔,請使用引用。有許多問題涉及SO之間的參考和嵌入之間的折衷,所以這裏是one question,並有非常好的答案。