Как обновить встроенный документ в MongoDB с помощью Doctrine ODM

Я не могу найти, как обновить встроенные документы с помощью Doctrine Mongo ODM в Symfony2. У меня есть класс Page со многими встроенными документами «Комментарии», и я хочу использовать createQueryBuilder для обновления конкретного комментария. Вот простой класс, который у меня есть:

страница класса {

protected $id;

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

}

Я обыскал весь Интернет, но не нашел никакой информации о том, как обновлять вложенные документы документа с помощью построителя запросов Doctrine ODM. Я буду благодарен за любую информацию, так как я новичок как в Doctrine, так и в Mongo. Проще говоря, я хочу обновить конкретный комментарий на странице после поиска по идентификатору.

Заранее спасибо за помощь!


person Kik Minev    schedule 11.04.2013    source источник


Ответы (3)


Если вы хотите использовать queryBuilder, используйте это

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

Или когда вы создаете сеттеры и геттеры для переменной-члена EmbedMany, она будет генерировать функции добавления и удаления внутри вашего класса. поэтому в вашем случае это будут функции-члены:

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(), которая добавит его, если он не существует, и обновит его, если он уже есть.

person aditya    schedule 24.04.2013

Вы можете обновить только одно поле за раз (вместо pageComment.$):

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

person    schedule
comment
Разве вы не получили ошибку типа Notice: Undefined offset: 2 in C:\MyProject\vendor\doctrine\mongodb-odm\lib\Doctrine\ODM\MongoDB\Persisters\DocumentPersister.php line 998 при использовании этого кода? - person Christian; 26.07.2013
comment
Это была ошибка в mongodb-odm, исправленная с github.com/doctrine/mongodb- odm/pull/661. - person eymen; 31.10.2013