【问题标题】:Doctrine Mongo ODM reference 3 collectionsDoctrine Mongodb ODM 参考3合集
【发布时间】:2012-09-06 13:59:35
【问题描述】:

您好,我正在尝试引用 3 个集合,但我在 2 > 3 次引用中失败了,让我解释一下我要做什么。

我的用户类有参考帖子 referenceMany > 帖子,在帖子中我有 referenceMany > cmets。

注意:Doctrine Mongo ODM + Zend Framework 2

这就像用户写了一个帖子然后有人评论它。

/** @MongoDB\Document */
class Users {

    /** @MongoDB\ReferenceMany(targetDocument="Posts", mappedBy="user") */
    private $posts;

}

/** @MongoDB\Document */
class Posts {

    /** @MongoDB\Id */
    private $wallPostId;

    /** @MongoDB\ReferenceOne(targetDocument="Users", inversedBy="posts") */
    private $user;

    /** @MongoDB\ReferenceMany(targetDocument="Comments", mappedBy="post") */
    private $comments;

    /** @MongoDB\String */
    private $content;

}

/** @MongoDB\Document */
class Comments {

    /** @MongoDB\Id */
    private $commentId;

    /** @MongoDB\ReferenceOne(targetDocument="Posts", inversedBy="comments") */
    private $post;

    /** @MongoDB\String */
    private $content;

}

我正在尝试使用此代码从任何帖子中获取所有 cmets

$post = $wallPostsAction->getWallPostById("5051d2a1e71a382c1b000000");
$output = "";
$output .= "Wall post content: " . $post->getContent() . "<br>";
//      $comment = new Comments();
//      $comment->setContent("Nice topic!");
//      $comment->setPost($post);
//      $this->dm->persist($comment);
//      $this->dm->flush();

echo count($post->getComments());
foreach($post->getComments() as $comment){
    $output .= " comment: " . $comment->getComment() . "<br>";
}

其中一个文档看起来像这样以供评论:

{
   "_id": ObjectId("---"),
   "post"?: {
     "$ref": "Posts",
     "$id": ObjectId("---"),
     "$db": "db" 
  },
   "content": "Nice topic!" 
}

问题是为什么当我尝试获取特定帖子的评论时,我的评论计数为 0,但当我尝试从用户那里获取帖子时,我可以得到它们。

【问题讨论】:

    标签: mongodb doctrine-odm odm


    【解决方案1】:

    因为 getComments() 返回的只是该集合的游标。在您开始迭代该集合之前,Doctrine 不会运行任何查询来获取信息。

    将此添加到您的 getWallPostById 方法中的查询中。

    ->field('comments')->prime(true)
    

    这将告诉教条在您获取帖子时获取有关 cmets 的数据,然后您的 getComments 中的光标应该具有您正在寻找的计数信息。

    Priming references

    【讨论】:

    • 您是说我必须为此创建自定义查询? 'echo count($post->getComments());'怎么样?吸气剂
    • 看起来您已经在 getWallPostById 中进行了查询?也许在存储库类中?我的意思是,如果您将主要选择添加到您的查询中,它将告诉教义在第一个查询中获取有关该参考的所有信息,而不是等到您想要访问该参考。这就是为什么你的'回声计数($post->getComments());'第一次不起作用,因为没有主要操作,它没有关于 cmets 的任何信息。如果你在你的 foreach 声明之后附和,我认为你会得到你所期望的答案,因为你已经使用了参考
    • 但这将始终加载带有帖子的 cmets 并且不会是延迟加载,对吗? intead get references 将加载所有帖子的所有 cmets。
    • 正确。如果您知道要遍历所有 cmets,则应使用 prime,以便在两次访问数据库中获得所需的所有信息。否则为#cmets+1 次。如果您仍需要 cmets 的计数,则在前往 DB 进行评论之前,您必须将计数存储在 post 文档中。这会导致更多的写入,因为您必须为每条评论更新帖子。
    • 我刚刚重读了这个问题。不,它只会加载引用该帖子的所有 cmets。如果您知道您将在找到该帖子后使用 getComments 方法。您应该使用 prime 选项,因为这是将数据返回到您的应用程序的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多