2012-09-05 35 views
6

Tôi có tài liệu có tài liệu được nhúng. Khi tôi tạo một đối tượng cho lần đầu tiên mọi thứ hoạt động tốt, nhưng khi tôi cố cập nhật tài liệu, tài liệu được nhúng không được cập nhật.Làm cách nào để cập nhật các tài liệu nhúng trong Doctrine MongoDB?

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

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

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

Trong ứng dụng của tôi, tôi truy vấn tài liệu, cập nhật giá trị và lưu giữ chúng vào kho dữ liệu.

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

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

Nếu tôi không cập nhật các tài liệu nhúng, nhưng thiết lập một tất cả mọi thứ mới hoạt động tốt:

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

Như tôi đã nói, biến thể B hoạt động tốt. Tuy nhiên, trong ứng dụng của tôi các tài liệu phức tạp hơn và tôi sẽ không thực tế khi tạo một đối tượng mới cho tài liệu được nhúng mỗi lần tôi phải cập nhật nó. Có một phương pháp để nói với Doctrine ODM để xem xét các giá trị của một tài liệu nhúng để quyết định xem nó có nên được cập nhật không?

Trả lời

0

MongoDB chỉ có hoạt động nguyên tử. Bạn có các tùy chọn: 1. Truy vấn tài liệu, tìm tài liệu phụ thích hợp, cập nhật toàn bộ tài liệu hoặc phần của nó. Ưu điểm: logic đơn giản Nhược điểm: không nguyên tử 2. Sử dụng toán tử $ vị trí là các subdocuments của bạn nằm trong danh sách.

2

Tôi gặp phải vấn đề tương tự. Hóa ra UnitOfWork dường như thất bại trong việc tính toán các thay đổi của tài liệu với các tài liệu khác được nhúng, mặc dù tôi không thể tìm ra lý do tại sao ... Kết quả là khi so sánh giá trị thực tế và giá trị ban đầu, đơn vị công việc cho thấy cùng một giá trị cho cả hai. Phát biểu với Ngôn ngữ địa phương của bạn A, khi bạn

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

Đơn vị công tác cho thấy "foo baz" cho cả người già và những giá trị mới và sẽ không nhận ra nó như là một sự thay đổi và sẽ do không cập nhật nó.

Dù sao, leeds này cho một workaround:

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

Điều này làm cho các đơn vị làm việc nhận ra docB của $ tài liệu như một tài liệu mới được thiết lập và sẽ tuôn nó như mong đợi.

+0

Tôi đang gặp sự cố khi thay thế tài liệu được nhúng bằng tài liệu khác. Trong trường hợp của tôi DocumentB không phải là một EmbeddedDocument mà là một tài liệu. Sử dụng tách trên đối tượng như bạn đã cho thấy ở đây cũng làm việc trong kịch bản này. – Onema

Các vấn đề liên quan