![](/img/trans.png)
[英]Doctrine2 and MongoDB Query on embedded array of an embedded array of referenced documents in a Document
[英]How do I query embedded documents by a referenced document?
我正在使用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如何讓您直接返回嵌入式文檔。
如果您使用ReferenceMany
或ReferenceOne
,則無法通過任何引用文檔字段查詢,除了引用文檔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除外),則應使用embedOne
或embedMany
而不是reference。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.