使用学说的MongoDB的ODM - 如何找到嵌入文档域的文档?

问题描述 投票:5回答:2

我有以下文件:

  • 一个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")})
php mongodb doctrine-orm doctrine doctrine-odm
2个回答
6
投票

我发现,有时answer provided by Madarco不能正常工作。如果你要查询嵌入文档中的参考场的$id场,您可能需要MongoId对象传递给equals()方法。所以在这种情况下,这将是:

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

1
投票

刚刚查询的SiteFollow文件(这是用户文档中嵌入的集合中)在DbRefsiteItem的$ id字段:

$repo = $odm->getRepository("User");
$repo->createQueryBuilder()
         ->field("follows.siteItem.$id")
         ->equals($siteId)
         ->getQuery()
         ->execute();
© www.soinside.com 2019 - 2024. All rights reserved.