5

私は次のドキュメントを持っています:

  • Userドキュメント。
  • への参照を含む埋め込みドキュメント (次のドキュメントを参照)
  • Siteドキュメント_

各ユーザーは内部に埋め込みドキュメントの配列を持ち、それぞれがフォローしているアイテム (サイト、Twitter アカウント) を表し、興味のある特定のカテゴリをマークするオプションがあります。各埋め込みドキュメントには、3 番目のSiteドキュメント (ドキュメント (またはドキュメント))への参照があります。Twitter文書など)。

問題は、MongoDB ODM を使用して、特定のサイトをフォローすることを選択したすべてのユーザーのドキュメントを、そのサイトの ID を使用して取得するにはどうすればよいかということです。
(以下(ファイルの後に)mongodbシェルでどのように行われるかを参照)

ユーザー.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 シェルでのユーザー ドキュメントの例:

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")})
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 ドキュメント (User ドキュメントの埋め込みコレクションにあります)のDbRefフィールドの $id フィールドをクエリするだけです。siteItem

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