在ReferenceMany字段中查找对象数组中的特定对象

时间:2013-03-02 17:49:00

标签: mongodb symfony doctrine-orm doctrine

我在学说手册中找不到如何做一个非常简单的查询。我不知道如何使用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。 我想:
1)查找用户的最新消息
2)从用户

中查找有关该主题的最新消息

$ dm-> find('User',$ id) - > getMessages()给我一个“PersistentCollection”
$ dm-> find('User',$ id) - > getMessages() - > getValues()为我提供了消息数组,但后来我必须使用PHP循环,我确定有一个创建查询的方法......

我应该使用map还是reduce?

有人能帮助我吗?谢谢!

1 个答案:

答案 0 :(得分: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