[英]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: 如果您使用
ReferenceMany
或ReferenceOne
,则无法通过任何引用文档字段查询,除了引用文档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除外),则应使用
embedOne
或embedMany
而不是reference。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.