【问题标题】:How to update embedded document in MongoDB with Doctrine ODM如何使用 Doctrine ODM 更新 MongoDB 中的嵌入文档
【发布时间】:2013-04-11 13:28:39
【问题描述】:

我找不到如何在 Symfony2 中使用 Doctrine Mongo ODM 更新嵌入式文档。我有一个名为 Page 的类,其中包含许多嵌入式文档“评论”,我想使用 createQueryBuilder 来更新特定评论。这是我拥有的一个简单的类:

类页面 {

protected $id;

/** @MongoDB\EmbedMany */
private $pageComment = array();

}

我搜索了整个互联网,但没有找到任何有关如何使用 Doctrine ODM 查询生成器更新文档子文档的信息。我会感谢任何信息,因为我是 Doctrine 和 Mongo 的新手。简单来说,我想在通过 id 搜索后更新页面中的特定评论。

提前感谢您的帮助!

【问题讨论】:

    标签: mongodb symfony doctrine mongodb-php doctrine-odm


    【解决方案1】:

    如果你想使用 queryBuilder 使用这个

    $dm->createQueryBuilder('Page')
        ->update()
        ->field('page.pageComment')->set( <$newupdatePageCommentObj> )
        ->field('id')->equals('<matchedId>')
        ->getQuery()
        ->execute();
    

    或者,当您为 EmbedMany 成员变量生成 setter 和 getter 时,它将在您的类中生成 add 和 remove 成员函数。所以在你的情况下,这些将是成员函数:

    public function addPageComment(type_hint_with_your_pageComment_document $pageComment )
    {
        $this->pageComment[] = $pageComment;
    }
    public function removePageComment( type_hint_with_your_pageComment_document $pageComment )
    {
        $this->items->removeElement( $pageComment );
    }
    

    所以你可以使用 addPageComment() 函数,如果它不存在,它会添加它,并更新它,让它已经存在。

    【讨论】:

      【解决方案2】:

      您一次只能更新一个字段(而不是pageComment.$):

      $this->createQueryBuilder('page')
          ->update()
          ->field('id')->equals($pageId)
          ->field('pageComment.id')->equals($pageCommentId)
          ->field("pageComment.$.field1")->set($field1)
          ->getQuery()
          ->execute();
      

      【讨论】:

        【解决方案3】:
         $yourArrayPageComment = array(
          "id" => new \MongoId($pageCommentId),
          "field1" => $field1,
          ...
        )
        
         $this->createQueryBuilder('page')
                    ->update()
                    ->field('id')->equals($pageId)
                    ->field('pageComment.id')->equals($pageCommentId)
                    ->field("pageComment.$")->set($yourArrayPageComment)
                    ->getQuery()
                    ->execute();
        

        【讨论】:

        • 您在使用此代码时没有收到类似Notice: Undefined offset: 2 in C:\MyProject\vendor\doctrine\mongodb-odm\lib\Doctrine\ODM\MongoDB\Persisters\DocumentPersister.php line 998 的错误吗?
        • 这是 mongodb-odm 中的一个错误,从 github.com/doctrine/mongodb-odm/pull/661 开始修复。
        猜你喜欢
        • 2012-12-20
        • 2012-01-16
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        • 2012-06-11
        • 2018-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多