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。我想要:
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 回答