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

Php 如何通过引用文档查询嵌入文档?,php,doctrine-orm,mongodb,Php,Doctrine Orm,Mongodb,我使用的是Doctrine ODM,通过引用文档查询嵌入文档时遇到问题 考虑以下文件: <?php /** @Document */ class TopCategory { /** EmbedMany(targetDocument="SubCategory") */ private $subCategories; } /** @EmbeddedDocument */ class SubCategory { /** ReferenceMany(targe

我使用的是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;

}
第二种方法不起作用:

$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允许您直接返回嵌入文档的方式很有趣。

如果您使用
ReferenceMany
ReferenceOne
您不能通过任何参考文档字段进行查询,除了参考文档id,因为在mongodb中,参考文档存储如下:

{
  $id: 'id',
  $db: 'referenced_doc_db_name',
  $ref: 'referenced_doc_collection_name'
}
ReferenceOne,ReferenceMany在驱动程序中内部完成,如果需要加载某些包含引用的文档,驱动程序将发送其他请求以加载引用的文档

因此,下面的查询并不粗俗;):


如果您需要查询某些参考字段(id除外),您应该使用
embedOne
embedMany
而不是reference。

除了ref-id之外,是否还有其他方法可以查询任何参考字段?在我的例子中,我需要像
$qb->field('permissions.group.id')->equals($id)这样的东西权限是许多字段和组a引用字段的一部分
$category = $dm->createQueryBuilder('SubCategory')
    ->field('products.$id')->equals(new \MongoId($someProduct->getId()))
    ->getQuery()->execute();    
// .. works, but seems hackish