2012-09-05 18 views
6

मेरे पास एक दस्तावेज़ है जिसमें एक दस्तावेज़ एम्बेडेड है। जब मैं पहली बार ऑब्जेक्ट बनाता हूं तो सब कुछ ठीक काम करता है, लेकिन जब मैं दस्तावेज़ को अपडेट करने का प्रयास करता हूं, तो एम्बेडेड दस्तावेज़ अपडेट नहीं होता है।मैं डॉक्टर मोंगोडीबी में एम्बेडेड दस्तावेज़ कैसे अपडेट करूं?

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

मैं एम्बेडेड दस्तावेज़ अद्यतन नहीं करते हैं, लेकिन एक नया एक सब कुछ सेट ठीक काम करता है:

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

जैसा कि मैंने कहा, संस्करण बी ठीक काम करता है। हालांकि, मेरे आवेदन में दस्तावेज़ अधिक जटिल हैं और जब भी मुझे इसे अपडेट करना होता है तो एम्बेडेड दस्तावेज़ के लिए एक नई वस्तु बनाने के लिए यह अव्यवहारिक होगा। क्या यह तय करने के लिए कि क्या इसे अद्यतन किया जाना चाहिए, एक एम्बेडेड दस्तावेज़ के मूल्यों को देखने के लिए सिद्धांत ओडीएम को बताने का कोई तरीका है?

उत्तर

0

मोंगोडीबी में केवल परमाणु संचालन हैं। आपके पास विकल्प हैं: 1. दस्तावेज़ को क्वेरी करें, अनुचित उप-दस्तावेज़ खोजें, संपूर्ण दस्तावेज़ या उसके भाग को अद्यतन करें। पेशेवर: आसान तर्क विपक्ष: गैर-परमाणु 2. स्थितित्मक $ ऑपरेटर का उपयोग करें, आपके उप-दस्तावेज़ सूची में हैं।

2

मुझे बिल्कुल एक ही समस्या का सामना करना पड़ा। यह पता चला है कि यूनिटऑफवर्क एम्बेडेड अन्य दस्तावेजों के साथ दस्तावेजों के परिवर्तनों की गणना करने में विफल रहता है, हालांकि मैं यह समझने में सक्षम नहीं हूं कि क्यों ... परिणामस्वरूप, जब मैं वास्तविक मूल्य और मूल इकाई की तुलना करता हूं, इकाई काम दोनों के लिए एक ही मूल्य दिखाता है। अपने संस्करण एक साथ बात हो रही है, जब आप

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

काम की यूनिट दोनों पुराने और नए मूल्य के लिए "foo baz" से पता चलता है और एक एक बदलाव के रूप में मान्यता नहीं होगी और यह अद्यतन नहीं की वजह होगा।

वैसे भी, एक समाधान के लिए इस लीड्स:

$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 एक एम्बेडेड दस्तावेज़ नहीं बल्कि एक दस्तावेज़ है। आपके द्वारा यहां दिखाए गए ऑब्जेक्ट पर डिटेच का उपयोग करने से इस परिदृश्य में भी काम किया जाता है। – Onema