我有以下文件:
User
文件。Site
文件每个用户都有嵌入文档的内部数组,每个代表他遵循着一个项目 - 一个网站,一个Twitter帐户 - 与选项标记特定类别的他感兴趣的每一嵌入文档具有第三文件的引用 - 在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;
}
Site.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.findOne()
{
"_id": ObjectId("123"),
"follows": [
{
"interestingCategories": [
"PHP"
]
"siteItem" : ObjectId("OBJECT_ID_OF_SITE_DOCUMENT"),
"_doctrine_class_name" : "site"
}
]
}
为让所有关注的一个特定的网站上的用户蒙戈shell命令:
db.User.find({"follows.siteItem": ObjectId("OBJECT_ID_OF_SITE_DOCUMENT")})
我发现,有时answer provided by Madarco不能正常工作。如果你要查询嵌入文档中的参考场的$id
场,您可能需要MongoId
对象传递给equals()
方法。所以在这种情况下,这将是:
$repo = $odm->getRepository('User');
$repo->createQueryBuilder()
->field('follows.siteItem.$id')
->equals(new \MongoId($siteId))
->getQuery()
->execute();
刚刚查询的SiteFollow文件(这是用户文档中嵌入的集合中)在DbRef场siteItem
的$ id字段:
$repo = $odm->getRepository("User");
$repo->createQueryBuilder()
->field("follows.siteItem.$id")
->equals($siteId)
->getQuery()
->execute();