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

एक उदाहरण होगा जहां मेरे पास समूहों का संग्रह होगा। उस समूह में, सदस्यों की एक सरणी (सूची) होती है। उन सदस्यों में से प्रत्येक के पास कई उपनाम हो सकते हैं जिनके द्वारा वे जाते हैं। मुझे यह जानने की जरूरत है कि किसी विशिष्ट सदस्य के लिए उपनाम को हटाने/अपडेट करने के बारे में कैसे जाना है।

भूतपूर्व:

  1. मैं सदस्य को अपडेट करना चाहता था: रॉबर्ट जेम्स का उपनाम "नॉट रिक जेम्स" से "रिक"
  2. सदस्य जॉन स्मिथ से उपनाम "स्मिथी" हटाएं
// example mongo data
[{
 "_id": 482232389408781300,
 "Name": "Group A",
 "Members": [
  {
   "_id": "X4cLx72J9",
   "Name": "John Smith",
   "NickNames: [
     {
      "_id": "V2889Jw8",
      "Name": "Smithy"
     },
     {
      "_id": "V82lvi2",
      "Name": "Ol John"
     }
    ]
   },
   {
    "_id": "X4c7872J9",
   "Name": "Robert James",
   "NickNames: [
     {
      "_id": "V2Bl9Jw8",
      "Name": "Not Rick James"
     },
     {
      "_id": "V8Qrvi2",
      "Name": "Slick"
     }
    ]
   }
 }
]

// c# classes

class Group{
 public ulong Id {get;set;} // Unique Id
 public string Name {get;set;}
 public List<Member> Members{get;set;}
}

class Member{
 public string Id {get;set;} // Unique Id
 public string Name {get;set;}
 public List<NickName> NickNames{get;set;}
}

public NickName{
 public string Id {get;set;} // Unique Id
 public string Name {get;set;}
}

स्पष्टीकरण के लिए संपादन मुझे यह जानने की जरूरत है कि सी # के लिए मोंगोडीबी ड्राइवर का उपयोग करके इस अनुरोध को कैसे पूरा किया जाए

var guilds = db.GetCollection<Group>("groups");
var filter = Builders<Group>.Filter;
/// At this point I'm unsure how the filter/update values should be coded in order to update the mongo db.
0
Jason R. 15 जुलाई 2020, 04:27
क्या आपने अपडेटबिल्डर को देखा है? mongodb.com/blog/post/…
 – 
Chris Moutray
15 जुलाई 2020, 09:16
- यह अन्य परिणामों के समान है जो मुझे इस समस्या को हल करने का प्रयास करते समय मिलते हैं। यह मूल दस्तावेज़ पर वस्तुओं के मूल सरणी/संग्रह के लिए ठीक काम करता है। लेकिन मुझे लगता है कि यह किसी अन्य संग्रह के अंदर संग्रह के साथ काम करने के लिए प्रतीत नहीं होता है। जैसे कि इस मामले में समूह-> सदस्य-> उपनाम जहां मैं उपनाम में मूल्यों को बदलना / हटाना चाहता हूं।
 – 
Jason R.
15 जुलाई 2020, 19:32

2 जवाब

मान लें कि यह आपका डेटा है,

List<NickName> nickNameList = new List<NickName>();
nickNameList.Add(new NickName() { Id = "V2889Jw8", Name = "Smithy" });
nickNameList.Add(new NickName() { Id = "V82lvi2", Name = "Ol John" });

List<NickName> nickNameList2 = new List<NickName>();
nickNameList2.Add(new NickName() { Id = "V2Bl9Jw8", Name = "Not Rick James" });
nickNameList2.Add(new NickName() { Id = "V8Qrvi2", Name = "Slick" });

List<Member> members = new List<Member>();
members.Add(new Member() { Id = "X4cLx72J9", Name = "John Smith", NickNames = nickNameList });
members.Add(new Member() { Id = "X4c7872J9", Name = "Robert James", NickNames = nickNameList2 });

List<Group> group = new List<Group>();
group.Add(new Group(){
    Id = 482232389408781300,
    Name = "Group A",
    Members = members
});

हम सूची में विशिष्ट रिकॉर्ड खोजने और उसे अपडेट करने या हटाने के लिए List की .Find() विधि का उपयोग कर सकते हैं।

उदाहरण के लिए:

//Update
group.Find(x => x.Id == 482232389408781300).Members.Find(x => x.Id == "X4c7872J9").NickNames.Find(n => n.Name == "Not Rick James").Name = "Rick";

//Delete
List<NickName> nickNames = group.Find(x => x.Id == 482232389408781300).Members.Find(x => x.Id == "X4cLx72J9").NickNames;
nickNames.Remove(nickNames.Find(n => n.Name == "Smithy"));
0
Loong 15 जुलाई 2020, 05:14
मैं देख रहा हूं कि सी # के भीतर मोंगो के साथ वास्तव में इस अद्यतन को कैसे पूरा किया जाए।
 – 
Jason R.
15 जुलाई 2020, 05:33
ओह, इसका उल्लेख करने वाले प्रश्न को नहीं देखा। वैसे मैं मोंगो से परिचित नहीं हूँ इसलिए शुभकामनाएँ
 – 
Loong
15 जुलाई 2020, 05:48

मुझे लगता है कि मैंने दो तरीकों पर काम किया है जो मेरे लिए काम करते हैं। वे सबसे कुशल नहीं हो सकते हैं इसलिए मैं और अधिक पढ़ना जारी रखूंगा। लेकिन यहाँ वही है जो मेरे पास अब तक है।

निम्नलिखित विलोपन विधि स्थितीय सभी '$[]' विकल्प का उपयोग करती है क्योंकि प्रत्येक उपनाम की एक विशिष्ट आईडी होती है।

// Delete An array item
var groupId = 482232389408781300;
var memberId = "X4cLx72J9";
var nickId = "V2889Jw8";

var collection = _db.GetCollection<Group>("groups");
var filter = Builders<Group>.Filter.Eq(group => group.Id, groupId);
var update = Builders<Group>.Update.PullFilter("Members.$[].NickNames", Builders<BsonDocument>.Filter.Eq("_id", nickId));
collection.UpdateOne(filter, update);

अद्यतन विधि ArrayFilters विकल्प का उपयोग कर रही है। मुझे लगता है कि आप इसे हटाने की विधि के लिए भी इस्तेमाल कर सकते हैं।

// Update An array item
var groupId = 482232389408781300;
var memberId = "X4cLx72J9";
var nickId = "V2889Jw8";
var newNick = "Loon";

var collection = _db.GetCollection<Group>("groups");
var filter = Builders<Group>.Filter.Eq(group => group.Id, groupId);
var update = Builders<Group>.Update.Set("Members.$[m].NickNames.$[n].Name", newNick); 
var filterArray = new List<ArrayFilterDefinition>{
 new JsonArrayFilterDefinition<Group>(string.Format("{{'m._id': '{0}'}}", memberId)),
 new JsonArrayFilterDefinition<Group>(string.Format("{{'n._id': '{0}'}}", nickId))
};

var updateOptions = new UpdateOptions { ArrayFilters = filterArray };

collection.UpdateOne(filter, update, updateOptions);
0
Jason R. 15 जुलाई 2020, 23:43