5

我有以下文件:

  • 一份User文件。
  • 嵌入文档,包含对(参见下一个文档)的引用
  • 一份Site文件

每个用户都有一个嵌入文档数组,每个代表他关注的一个项目 - 一个网站,一个推特账户 - 可以选择标记他感兴趣的特定类别。每个嵌入文档都有对第三个文档的引用 -Site文档(或Twitter文件等)。

问题是 - 使用 MongoDB ODM,如何使用该站点的 id 获取选择关注给定站点的所有用户的文档?
(见下文(在文件之后)如何在 mongodb shell 中完成)

用户.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;
}

网站关注.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;
}

mongo shell 中的用户文档示例:

db.User.findOne()
{
    "_id": ObjectId("123"),
    "follows": [
        {
            "interestingCategories": [
                "PHP"
            ]
            "siteItem" : ObjectId("OBJECT_ID_OF_SITE_DOCUMENT"),
            "_doctrine_class_name" : "site"
        }
    ]
}

Mongo shell 命令用于获取关注特定站点的所有用户:

db.User.find({"follows.siteItem": ObjectId("OBJECT_ID_OF_SITE_DOCUMENT")})
4

2 回答 2

7

我发现Madarco 提供的答案有时无法正常工作。如果您正在查询$id嵌入文档中引用字段的字段,您可能需要将MongoId对象传递给该equals()方法。所以在这种情况下,它将是:

$repo = $odm->getRepository('User');
$repo->createQueryBuilder()
    ->field('follows.siteItem.$id')
    ->equals(new \MongoId($siteId))
    ->getQuery()
    ->execute();
于 2014-11-21T07:56:47.567 回答
1

只需在 SiteFollow 文档中查询DbRef字段的 $id 字段siteItem(在用户文档的嵌入集合中):

$repo = $odm->getRepository("User");
$repo->createQueryBuilder()
         ->field("follows.siteItem.$id")
         ->equals($siteId)
         ->getQuery()
         ->execute();
于 2013-12-04T16:04:15.897 回答