如何通过引用的文档查询嵌入的文档?

时间:2011-03-18 03:34:38

标签: php doctrine-orm mongodb

我正在使用Doctrine ODM,并且无法通过引用文档查询嵌入式文档。

考虑以下文件:

<?php

/** @Document */
class TopCategory 
{

    /** EmbedMany(targetDocument="SubCategory") */
    private $subCategories;

}

/** @EmbeddedDocument */
class SubCategory 
{

    /** ReferenceMany(targetDocument="Product") */
    private $products;

}


/** @Document */
class Product
{

    /** @String */
    private $name;

}

现在我想知道如何按产品找到TopCategory(或SubCategory),我尝试了几种不同的方法来实现这一点,一种方法有效,但有点hackish。

第一种方式,不起作用:

$category = $dm->createQueryBuilder('TopCategory')
    ->field('subCategories.products')->includesReferenceTo($someProduct)
    ->getQuery()->execute();
// ... gives Doctrine\ODM\MongoDB\MongoDBException: No mapping found for field 'subCategories.products' in class 'TopCategory'.'

第二种方式,不起作用:

$category = $dm->createQueryBuilder('SubCategory')
    ->field('products')->includesReferenceTo($someProduct)
    ->getQuery()->execute();    
// ... returns null

第三,工作解决方法:

$category = $dm->createQueryBuilder('SubCategory')
    ->field('products.$id')->equals(new \MongoId($someProduct->getId()))
    ->getQuery()->execute();    
// .. works, but seems hackish

我正在使用GitHub和MognoDB v1.8.0中的最新版本 这有什么用呢?

注意:有趣的是Doctrine ODM如何让您直接返回嵌入式文档。

1 个答案:

答案 0 :(得分:7)

如果您使用ReferenceManyReferenceOne,则无法通过任何参考文档字段进行查询,但参考文档ID除外,因为在mongodb参考文档中存储如下:

{
  $id: 'id',
  $db: 'referenced_doc_db_name',
  $ref: 'referenced_doc_collection_name'
}

ReferenceOne,ReferenceMany在驱动程序内部完成,如果需要加载一些具有引用驱动程序的文档,则发送其他请求以加载引用的文档。

所以,以下查询不是hackish;):

$category = $dm->createQueryBuilder('SubCategory')
    ->field('products.$id')->equals(new \MongoId($someProduct->getId()))
    ->getQuery()->execute();    
// .. works, but seems hackish

如果您需要查询某些参考字段(ID除外),则应使用embedOneembedMany代替参考。