簡體   English   中英

如何通過引用的文檔查詢嵌入的文檔?

[英]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如何讓您直接返回嵌入式文檔。

如果您使用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而不是reference。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM