0

コレクション要素のネストされた検索に次の問題があります。

class User
{
    /*
     * @MongoDB\Id(strategy="auto")
     */
    protected $id;
}

class Network
{
    /*
     * @MongoDB\ReferenceOne(targetDocument="User")
     */
    protected $owner;
}

class Connection
{
    /*
     * @MongoDB\ReferenceOne(targetDocument="Network")
     */
    protected $network;
}

Doctrine ODM Query builder で (ユーザー ID によって) すべてのユーザー所有のネットワーク接続を見つけるにはどうすればよいですか? PS ネイティブ mongodb クエリも受け入れます。

4

3 に答える 3

0

残念ながら、参照ドキュメントのフィールドを直接クエリすることはできません。リレーショナル データベースで処理する方が適切です。MongoDB ではもちろん可能ですが、複数のクエリが必要です。最初にユーザーが属するネットワークを見つけ、次にネットワークの接続を見つける必要があります。

もちろん、ネットワーク識別子のリストを取得して接続クエリを作成するだけで十分です。これは、クエリ ビルダーを使用して簡単に実行できます。

$networkQb = $this->dm->getRepository(Network::class)->createQueryBuilder();
$networkQb->field('owner.$id')->equals($userId);
$networkQb->select('_id'); // Limit results to the ID of the network only
$networkQb->hydrate(false); // Don't return Network objects but only plain array

$networkResults = $networkQb->getQuery()->toArray();
$networkIdList = array_map(function($result) { return $result['_id']; }, $networkResults); // This converts array(array("_id" => "1234"), array("_id" => "5678")) to array("1234","5678")

// Then we'll make the actual query for the connections, based on the id list of the networks
$connectionQb = $this->dm->getRepository(Connection::class)->createQueryBuilder();
$connectionQb->field('network.$id')->in($networkIdList);

$connections = $connectionQb->getQuery()->toArray();

この種のクエリは、ユーザーごとに少数のネットワークしかない限り、比較的高速です。

于 2014-01-30T09:35:14.300 に答える
0

https://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.htmlのような@MongoDB\ReferenceOneには、Query Builderのreferences()メソッドを使用する必要があります。

$user = $dm->getRepository('User')->findOneById($userId);

$queryBuilder = $dm->getRepository('Network')->createQueryBuilder()
                   ->field('owner')->references($user);

$ownNetworkConnections = $queryBuilder->getQuery()->execute();


PS : includesReferenceTo()@MongoDB\ReferenceManyに使用します。

于 2015-10-09T13:17:46.980 に答える