У меня есть следующие документы:
User
.Site
documentКаждый пользователь имеет массив встроенных документов внутри, каждый из которых представляет элемент, который он следует, - сайт, учетную запись Twitter, с возможностью отмечать интересующие их категории. Каждый встроенный документ имеет ссылку на третий документ - Site
document (или Twitter
document и т.д.).
Вопрос: используя ODM MongoDB, как я могу получить документы всех пользователей, которые решили следовать за данным сайтом, используя идентификатор этого сайта?
(см. ниже (после файлов), как это делается в оболочке 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;
}
Пример для пользовательского документа в оболочке mongo:
db.User.findOne()
{
"_id": ObjectId("123"),
"follows": [
{
"interestingCategories": [
"PHP"
]
"siteItem" : ObjectId("OBJECT_ID_OF_SITE_DOCUMENT"),
"_doctrine_class_name" : "site"
}
]
}
Командная оболочка Mongo для получения всех пользователей, следующих за определенным сайтом:
db.User.find({"follows.siteItem": ObjectId("OBJECT_ID_OF_SITE_DOCUMENT")})
Я обнаружил, что ответ, предоставленный Madarco, иногда не работает должным образом. Если вы запрашиваете поле $id
ссылочного поля во встроенном документе, вам может потребоваться передать объект MongoId
методу equals()
. Поэтому в этом случае это будет:
$repo = $odm->getRepository('User');
$repo->createQueryBuilder()
->field('follows.siteItem.$id')
->equals(new \MongoId($siteId))
->getQuery()
->execute();
Просто запрос для поля $id поля DbRef siteItem
в документе SiteFollow (который находится во встроенной коллекции в документ пользователя):
$repo = $odm->getRepository("User");
$repo->createQueryBuilder()->field("follows.siteItem.$id")->equals($siteId)->getQuery()->execute();
$builder->Field ('follows. siteItem')->getQuery()->execute();