在Doctrine2和MongoDB中引用嵌入文档

时间:2013-06-20 10:21:27

标签: php mongodb symfony doctrine-orm

我的文档用户包含

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

和文档 ImageCollection ,其中嵌入了名为Image

的文档
/** 
 * @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是null?

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

1 个答案:

答案 0 :(得分:1)

问题是您无法引用嵌入式文档。您只能引用文档。仔细阅读MongoDB文档中的Data Modeling Considerations会发现您必须在嵌入和引用之间进行选择。

通常,只需要从主文档访问嵌入式文档(单向多关系)时使用嵌入式文档。如果您需要从多个位置引用文档(它属于多个文档)或单独查询文档,请使用引用。有很多问题涉及在SO上引用和嵌入之间的权衡,所以这里有one question得到了很好的答案。