1

非常に単純なクエリを実行する方法をドクトリンマニュアルで見つけることができません。MongoDb で SQL の "JOIN ..." に相当するものを管理する方法がわかりません。

abstract class Topic
{
    /**
     * @MongoDB\Id
     */
    protected $id;
}

abstract class Message
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\Date
     */
    protected $date;

    /**
     * @MongoDB\ReferenceOne(targetDocument="Topic")
     */
    protected $topic;
}

abstract class User
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\ReferenceMany(targetDocument="Message")
     */
    protected $messages;
}

ユーザー ID とトピック ID があります。I want :
1) ユーザーからの最新のメッセージを
検索する 2) ユーザーからのトピックに関する最新のメッセージを検索する

$dm->find('User', $id)->getMessages() は「PersistentCollection」を提供します
$dm->find('User', $id)->getMessages()->getValues() は私にメッセージの配列ですが、PHPループを使用する必要があります。それを行うためのクエリを作成する方法があると確信しています...

map または reduce を使用することになっていますか?

誰かが私を助けることができますか?ありがとう !

4

1 に答える 1

1

まず、データベース スキーマを修正する必要があります。

メッセージは複数のユーザーに属することができますか?

通常、メッセージは作成者のみを持つことができるため、メッセージ ドキュメントを変更して作成者を保存しますUser id

class Message
{
    /**
     * @MongoDB\ReferenceOne(targetDocument="User")
     */
     protected $author;

     //Othe methods...
}

次に、ユーザーからの最新のメッセージを見つけるには:

class User {

     /**
     * @ReferenceOne(
     *      targetDocument="Message",
     *      mappedBy="author",
     *      sort={"date"="desc"}
     * )
     */
     protected $lastMessage;

     //Other methods...
}

トピックに関する最新のメッセージを見つけるには:

class User {

     /**
     * @ReferenceOne(
     *      targetDocument="Message",
     *      mappedBy="author",
     *      criteria={"topic" : "sport"}
     *      sort={"date"="desc"}
     * )
     */
     protected $lastMessageAboutSport

     //Other methods...
}

詳細: Doctrine ODM Complex References Guide

于 2013-05-01T07:06:37.673 に答える