सुनिश्चित नहीं है कि आप वास्तव में क्या चाहते हैं। MongoDB में अनिवार्य रूप से दो प्रकार के अपडेट होते हैं:आप एक परमाणु अद्यतन कर सकते हैं , या दस्तावेज़ बदलें ।
दस्तावेज़ को बदलना अक्सर आसान होता है , क्योंकि यह आपको संशोधन करने के लिए मानक C# संचालन का उपयोग करने की अनुमति देता है और यह उत्पन्न गुणों और इस तरह का पुनर्मूल्यांकन करेगा:
var user = new User { Name = "John Doe", Quests =
new Dictionary<string, Tuple<string, string>> {
{ "hoho", new Tuple<string, string>("A", "A-Item") } } };
users.InsertOneAsync(user).Wait();
user.Quests = new Dictionary<string, Tuple<string, string>> {
{ "hoho Modified", new Tuple<string, string>("B", "B-Item") } };
users.ReplaceOneAsync(p => p.Id == user.Id, user);
हालांकि, कभी-कभी परमाणु संशोधक का उपयोग करना आवश्यक होता है, जैसे $push
, $pull
, $set
, $addToSet
, आदि समवर्ती चिंताओं के कारण। मैं आम तौर पर इस तरह से जटिल एम्बेडेड ऑब्जेक्ट्स पर जटिल संचालन करना एक बुरा विचार मानता हूं, क्योंकि ऑब्जेक्ट की संगति की उच्च संभावना है। (एसिड अर्थ में, या 'ऑब्जेक्ट इनवेरिएंट' ) चेक नहीं किया जा सकता है।
मान लीजिए कि एक उपयोगकर्ता को एक समय में 3 से अधिक सक्रिय खोज करने की अनुमति नहीं दी जानी चाहिए, तो कौन यह सुनिश्चित करता है कि इस नियम का पालन किया जाए? यह आम तौर पर कोड की ज़िम्मेदारी है, और जटिल आविष्कारों को डेटाबेस द्वारा चेक नहीं किया जा सकता है।
यदि आप अभी भी उन परमाणु ऑपरेटरों का उपयोग करना चाहते हैं, तो मेरा सुझाव है कि आप एक नया प्रश्न पूछें क्योंकि वहां यह वास्तव में विवरण पर निर्भर करता है (शब्दकोश, डिफ़ॉल्ट रूप से, एक दस्तावेज़ के रूप में क्रमबद्ध है, एक सरणी के रूप में टपल, और उन्हें विभिन्न परमाणु संशोधक की आवश्यकता होती है मोंगोडीबी में)। उदाहरण के लिए, शब्दकोश में एक नया आइटम जोड़ने के लिए, $set
. का उपयोग करें :
users.UpdateOneAsync(p => p.Id == user.Id,
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));