2013-03-06 104 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(); 
相关问题