Использование Doctrine's MongoDB ODM - Как найти документы по полям встроенных документов?

4

У меня есть следующие документы:

  • A User.
  • Вложенный документ, содержащий ссылку (см. следующий документ)
  • a 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")})
  • 0
    Помогает ли это вам: phpntips.com/…
  • 0
    Попробуйте это: $builder->Field ('follows. siteItem')->getQuery()->execute();
Теги:
doctrine
doctrine2
doctrine-odm

2 ответа

4

Я обнаружил, что ответ, предоставленный Madarco, иногда не работает должным образом. Если вы запрашиваете поле $id ссылочного поля во встроенном документе, вам может потребоваться передать объект MongoId методу equals(). Поэтому в этом случае это будет:

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

Просто запрос для поля $id поля DbRef siteItem в документе SiteFollow (который находится во встроенной коллекции в документ пользователя):

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню