हम वसंत डेटा के माध्यम से मोंगोडीबी का उपयोग कर रहे हैं और मौजूदा इकाइयों को अपडेट करने या नए बनाने के लिए 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
में पहले से ही करें।
हमने जो भी माना है वह पहले एक पुराना उदाहरण लोड कर रहा था और अद्यतन चल रहा था लेकिन यह सुरक्षित नहीं है क्योंकि इकाई लोड और अद्यतन के बीच संशोधित हो सकती है। इसे संस्करणों और आशावादी लॉकिंग के साथ संबोधित किया जा सकता है, लेकिन इससे चीजों को और भी जटिल बना दिया जाता है।
हाँ, ऐसा लगता है कि कोई दूसरा रास्ता नहीं है। – lexicore