2016-05-17 4 views
8

हम वसंत डेटा के माध्यम से मोंगोडीबी का उपयोग कर रहे हैं और मौजूदा इकाइयों को अपडेट करने या नए बनाने के लिए findAndModify ऑपरेशन पर भरोसा करते हैं।स्प्रिंग/मोंगोडीबी से पुरानी और नई इकाइयों को लौटाना और एंड्रॉइड

findAndModify में हम returnNew(...) का उपयोग कर इकाई की पुरानी स्थिति या नए को वापस करने के लिए कॉन्फ़िगर कर सकते हैं।

क्या findAndModify से पुरानी और नई इकाइयों को वापस करने का कोई तरीका है?

हमें पहले और बाद में इकाई राज्यों की तुलना करने की आवश्यकता है, यही कारण है कि हमें दोनों उदाहरणों की आवश्यकता है।

क्षण हम requireNew(false) का सहारा रहे हैं और उसके बाद मैन्युअल रूप से इस तरह पुराने उदाहरण की एक प्रति, कुछ अद्यतन में: के रूप में हम एक ही बातें फिर से करना है

public Pair<Data> saveItems(String id, List<Item> items) { 
    final Query findById = ...; 

    final Update update = new Update(); 
    // This is what we actually update 
    update.set(ENTITY_FIELD_ITEMS, newItems); 
    update.inc(ENTITY_FIELD_VERSION, 1); 
    // Try updating and return the old data 
    final Data oldData = operations.findAndModify(findById, update, 
     FindAndModifyOptions.options().upsert(true).returnNew(false), Data.class); 

    // Copy or create new instance 
    final Data newData; 
    if (oldData == null) { 
     newData = new Data(id); 
    } 
    else { 
     newData = new Data(oldData); 
    } 
    // Apply the same update 
    newData.setItems(newItems); 
    newData.incVersion(); 
    return new Pair<Data>(oldData, newData); 
} 

वर्क्स लेकिन सुंदर नहीं है हम पुराने उदाहरण की प्रतिलिपि पर Update में पहले से ही करें।

हमने जो भी माना है वह पहले एक पुराना उदाहरण लोड कर रहा था और अद्यतन चल रहा था लेकिन यह सुरक्षित नहीं है क्योंकि इकाई लोड और अद्यतन के बीच संशोधित हो सकती है। इसे संस्करणों और आशावादी लॉकिंग के साथ संबोधित किया जा सकता है, लेकिन इससे चीजों को और भी जटिल बना दिया जाता है।

उत्तर

4

क्या पुरानी और नई संस्थाओं को खोजने और एंड्रॉइड दोनों को वापस करने का कोई तरीका है?

नहीं, वहाँ findAndModify के साथ दोनों पुराने और नए मान देने के लिए कोई रास्ता नहीं है।

+0

हाँ, ऐसा लगता है कि कोई दूसरा रास्ता नहीं है। – lexicore

0

नहीं, findAndModify के साथ पुराने और नए मूल्य दोनों को वापस करने का कोई तरीका नहीं है।

लेकिन इससे पहले कि आप नीचे दिए गए चरणों

  1. कर अद्यतन करने के बाद entitiy राज्य तुलना करना चाहते हैं बस डेटा पुनः प्राप्त अद्यतन करने के लिए अपने findAndModify क्वेरी परिवर्तन returnNew करने के लिए प्राथमिक कुंजी और oldData में दुकान चर
  2. उपयोग करने से पहले सच नमूना sudocode नीचे newData

के तहत इसे सहेजने के लिए आप दोनों मूल्यों वापस आ जाएगी

public Pair<Data> saveItems(String id, List<Item> items) { 
    final Query findById = ...; 

    final Update update = new Update(); 
    // This is what we actually update 
    update.set(ENTITY_FIELD_ITEMS, newItems); 
    update.inc(ENTITY_FIELD_VERSION, 1); 
    // Try updating and return the old data 
    final Data oldData = findById(); //query to retrieve existing data 
    final Data newData = operations.findAndModify(findById, update, 
     FindAndModifyOptions.options().upsert(true).returnNew(true), Data.class); 

     return new Pair<Data>(oldData, newData); 
    } 
+0

पहले 'ढूंढ' और निम्नलिखित 'findAndModify' के बीच एक और अपडेट हो सकता है, इसलिए' oldData' अप्रचलित हो सकता है। – lexicore

+0

findAndModify थ्रेड-सुरक्षित है इसलिए ऐसा नहीं होगा और जैसे ही दोनों चरण एक दूसरे के बाद होते हैं, आपका उपयोग केस पर्याप्त होगा। – rajadilipkolli

+0

थ्रेड सुरक्षा के साथ इसके साथ कुछ लेना देना नहीं है। समांतर में डेटा प्रोसेसिंग कई धागे हो सकते हैं। तो 'find &Modify' परमाणु है,' खोज 'और 'findAndModify' का अनुक्रम नहीं है। अगला, डेटाबेस को विभिन्न प्रक्रियाओं या यहां तक ​​कि मशीनों से भी एक्सेस किया जा सकता है। गारंटी देने का कोई तरीका नहीं है कि 'find' और' findAndUpdate' के बीच कोई अपडेट ऑपरेशन नहीं होगा। – lexicore

संबंधित मुद्दे