如何更新Doctrine MongoDB中的嵌入式文档?

Flo*_*fer 6 php doctrine mongodb doctrine-odm

我有一个嵌入了文档的文档.当我第一次创建一个对象时,一切正常,但是当我尝试更新文档时,嵌入的文档不会更新.

/** @MongoDB\Document */
class DocumentA
{
    /** @MongoDB\EmbedOne(targetDocument="DocumentB") **/
    protected $docB;

    /** @MongoDB\String */
    protected $valueA;
}

/** @MongoDB\EmbeddedDocument */
class DocumentB
{
    /** @MongoDB\String */
    protected $valueB;
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我查询文档,更新值并将它们保存到数据存储中.

// Variant A – Does not work
$document = ... // find from data store
$document->setValueA('Hello World');
$document->getDocB()->setValueB('foo baz');

$om->persist($document);
$om->flush();
Run Code Online (Sandbox Code Playgroud)

如果我不更新嵌入式文档,但设置一个新文件一切正常:

// Variant B - Does work
$document = ... // find from data store
$document->setValueB('Hello World 2');
$document->setDocB(new DocumentB());
$document->getDocB()->setValueB('foo baz 2');

$om->persist($document);
$om->flush();
Run Code Online (Sandbox Code Playgroud)

正如我所说,变体B的工作正常.但是,在我的应用程序中,文档更复杂,每次我必须更新它时,为嵌入式文档创建一个新对象是不切实际的.有没有一种方法可以告诉Doctrine ODM查看嵌入式文档的值以决定是否应该更新它?

小智 0

MongoDB 只有原子操作。您可以选择: 1. 查询文档,找到适当的子文档,更新整个文档或其部分内容。优点:逻辑简单 缺点:非原子 2. 使用位置 $ 运算符是您的子文档在列表中。