简体   繁体   English

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

[英]How do I query embedded documents by a referenced document?

I'm using Doctrine ODM and am having trouble querying embedded documents by a referenced document. 我正在使用Doctrine ODM,并且无法通过引用文档查询嵌入式文档。

Consider the follow documents: 考虑以下文件:

<?php

/** @Document */
class TopCategory 
{

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

}

/** @EmbeddedDocument */
class SubCategory 
{

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

}


/** @Document */
class Product
{

    /** @String */
    private $name;

}

Now I am wondering how I could find a TopCategory (or SubCategory) by product, I've tried a few different ways to achieve this, one method works but is a bit hackish. 现在我想知道如何按产品找到TopCategory(或SubCategory),我尝试了几种不同的方法来实现这一点,一种方法有效,但有点hackish。

First way, doesn't work: 第一种方式,不起作用:

$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'.'

Second way, doesn't work: 第二种方式,不起作用:

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

Third, working workaround: 三,工作方法:

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

I am using the latest from GitHub and MognoDB v1.8.0 What's the go with this? 我正在使用GitHub和MognoDB v1.8.0中的最新版本这有什么用?

NOTE: Interesting how Doctrine ODM lets you return an embedded document directly. 注意:有趣的是Doctrine ODM如何让您直接返回嵌入式文档。

If you using ReferenceMany or ReferenceOne you can't query by any reference document field, except reference document id, since in mongodb reference document storing like this: 如果您使用ReferenceManyReferenceOne ,则无法通过任何引用文档字段查询,除了引用文档ID,因为在mongodb引用文档中存储如下:

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

ReferenceOne, ReferenceMany done internally in driver and if need load some document that have references driver send additional requests to load referenced documents. ReferenceOne,ReferenceMany在驱动程序内部完成,如果需要加载一些具有引用驱动程序的文档,则发送附加请求以加载引用文档。

So, following query not hackish ;): 所以,以下查询不是hackish;):

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

If you need query on some reference field (except id) you should use embedOne or embedMany instead of reference. 如果您需要查询某些引用字段(id除外),则应使用embedOneembedMany而不是reference。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM