2012-09-05 5 views
6

문서가 임베드되어 있습니다. 처음으로 개체를 만들면 모든 것이 잘 작동하지만 문서를 업데이트하려고 할 때 포함 된 문서가 업데이트되지 않습니다.Doctrine MongoDB에서 임베디드 문서를 어떻게 업데이트합니까?

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

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

/** @MongoDB\EmbeddedDocument */ 
class DocumentB 
{ 
    /** @MongoDB\String */ 
    protected $valueB; 
} 

내 응용 프로그램에서 문서를 쿼리하고 값을 업데이트 한 다음 데이터 저장소에 저장합니다.

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

$om->persist($document); 
$om->flush(); 

I가 포함 된 문서를 업데이트하지만 새 모두를 설정하지 않은 경우

잘 작동합니다 :

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

내가 말했듯이, 변형 B는 잘 작동합니다. 그러나 필자의 응용 프로그램에서는 문서가 더 복잡해지고 업데이트해야 할 때마다 포함 된 문서에 대한 새 개체를 만드는 것이 비현실적입니다. Doctrine ODM에 임베디드 문서의 값을보고 업데이트해야하는지 결정할 수있는 방법을 알려줄 수 있습니까?

답변

0

MongoDB에는 원자 연산 만 있습니다. 옵션이 있습니다. 1. 문서를 쿼리하고 해당 하위 문서를 찾은 다음 전체 문서 또는 해당 파트를 업데이트합니다. 장점 : 쉬운 논리 단점 : 비 원자 2. 위치 $ 연산자는 하위 문서가 목록에 있습니다.

2

나는 똑같은 문제에 직면했다. 그것은 UnitOfWork가 다른 문서가 삽입 된 문서의 변경 집합을 계산하는 데 실패한 것으로 나타났습니다. 이유는 무엇인지 파악할 수 없었지만 ... 결과적으로 실제 값과 원본 단위를 비교할 때 일의 두 가치 전부를위한 동일한 가치를 보여준다. 일의 당신

$document->getDocB()->setValueB('foo baz'); 

단위 이전 및 새 값을 모두 "foo는 바즈"을 보여 주며 변화로 인식되지 않으며을 업데이트하지 그 때문에 때, 여러분의 변형 A를 말하기.

어쨌든, 해결 방법이 리즈 :

$document = ... // find from data store 
$document->setValueA('Hello World'); 
$docB = $document->getDocB(); 
$docB->setValueB('foo baz'); 
$om->detach($docB); 
$om->persist($document); 
$om->flush(); 

이 작업 단위는 새로 설정된 문서로 $ 문서의 docB을 인식하고 예상대로를 플래시합니다 수 있습니다.

+0

다른 문서로 포함 된 문서를 바꾸는 데 문제가있었습니다. 제 경우 DocumentB는 EmbeddedDocument가 아니라 오히려 Document입니다. 여기에 보여준 것과 같이 객체에 detach를 사용하면이 시나리오에서도 잘 작동합니다. – Onema

관련 문제