2013-03-06 106 views
4

我有以下文件:使用Doctrine的MongoDB ODM - 如何通過嵌入文檔的字段查找文檔?

  • 一個User文件。
  • 嵌入文檔,包含一參考(見下一文件)
  • 一個Site文檔

每個用戶都有嵌入文檔的陣列內,每個代表他如下的項目 - 站點,微博賬戶 - 可以選擇標記他感興趣的特定類別。每個嵌入文檔都有對第三個文檔的引用 - Site文檔(或Twitter文檔等)。

的問題是 - 使用MongoDB的ODM,我怎麼能得到所有選擇跟隨一個給定的網站,利用該網站的ID用戶的文件?
(見下文(文件後),它是如何在MongoDB的外殼完成)

user.php的

<?php 
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; 

/** 
* @ODM\Document 
*/ 

class User { 
    /** 
    * @ODM\Id 
    * @var string 
    */ 
    protected $id; 

    /** 
    * @ODM\EmbedMany(
    *  discriminatorMap={ 
    *   "site"="SiteFollow", 
    *   "twitter"="TwitterFollow", 
    *  } 
    * ) 
    * @var ArrayCollection; 
    */ 
    protected $follows; 
} 

SiteFollow.php

<?php 
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; 

/** 
* @ODM\EmbeddedDocument 
*/ 

class SiteFollow { 
    /** 
    * @ODM\Collection 
    * @var array 
    */ 
    protected $interestingCategories; 

    /** 
    * @ODM\ReferenceOne(targetDocument="Site", simple=true) 
    * @var Site 
    */ 
    protected $siteItem; 
} 

網站。 PHP

<?php 
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; 

/** 
* @ODM\Document 
*/ 

class Site { 
    /** 
    * @ODM\Id 
    * @var string 
    */ 
    protected $id; 

    /** 
    * @ODM\String 
    * @var string 
    */ 
    protected $name; 

    /** 
    * @ODM\String 
    * @var string 
    */ 
    protected $url; 
} 

在蒙戈外殼用戶文檔的示例:

db.User.find({"follows.siteItem": ObjectId("OBJECT_ID_OF_SITE_DOCUMENT")}) 
+0

這是否幫助你:http://www.phpntips.com/mongodb-mysql-with-doctrine-2-example-of-listener-to-maintain-redundant -data-alternative-to-joins-2012-12/ – Gigala 2013-04-19 07:09:54

+0

試試這個:'$ builder-> Field('following。siteItem') - > getQuery() - > execute();' – 2013-04-29 11:19:08

回答

1

剛剛查詢了$ ID:

db.User.findOne() 
{ 
    "_id": ObjectId("123"), 
    "follows": [ 
     { 
      "interestingCategories": [ 
       "PHP" 
      ] 
      "siteItem" : ObjectId("OBJECT_ID_OF_SITE_DOCUMENT"), 
      "_doctrine_class_name" : "site" 
     } 
    ] 
} 

爲讓所有的用戶所遵循特定網站蒙戈shell命令字段DbRef字段siteItem位於SiteFollow文檔中(位於用戶文檔的嵌入式集合中):

$repo = $odm->getRepository("User"); 
$repo->createQueryBuilder()->field("follows.siteItem.$id")->equals($siteId)->getQuery()->execute(); 
4

我發現answer provided by Madarco有時無法正常工作。如果您要查詢嵌入式文檔中參考字段的$id字段,則可能需要將MongoId對象傳遞給equals()方法。所以在這種情況下,這將是:

$repo = $odm->getRepository('User'); 
$repo->createQueryBuilder() 
    ->field('follows.siteItem.$id') 
    ->equals(new \MongoId($siteId)) 
    ->getQuery() 
    ->execute(); 
相關問題