如何使用Doctrine ODM更新MongoDB中的嵌入式文档

时间:2013-04-11 13:28:39

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

我无法在Symfony2中找到如何使用Doctrine Mongo ODM更新嵌入式文档。我有一个名为Page的类,其中包含许多嵌入式文档“Comments”,我想使用createQueryBuilder更新特定注释。这是一个简单的课程:

课程页面 {

protected $id;

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

}

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

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

如果您想使用queryBuilder,请使用此

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

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

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()函数,如果它不存在就会添加它,并且它会在那里更新它。

答案 1 :(得分:0)

 $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();

答案 2 :(得分:0)

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

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