2013-02-13 25 views
9

मैं सी # ड्राइवर के साथ एक (टाइप किया गया) MongoDB संग्रह में एक पंक्ति को अपडेट करने का प्रयास कर रहा हूं। जब प्रकार MongoCollection<User> के उस विशेष संग्रह के डेटा को संभालने, मैं संग्रह (नमक, पासवर्ड हैश, आदि)MongoDB: केवल विशिष्ट फ़ील्ड अपडेट करें

से संवेदनशील डेटा पुन: प्राप्त अब मैं एक User उदाहरण अद्यतन करने के लिए कोशिश कर रहा हूँ से बचने के लिए करते हैं। हालांकि, मैंने वास्तव में पहले स्थान पर संवेदनशील डेटा को कभी भी पुनर्प्राप्त नहीं किया है, इसलिए मुझे लगता है कि संशोधनों को लागू करने और संग्रह में नया डेटा सबमिट करने से पहले यह डेटा पुनर्प्राप्त मॉडल उदाहरण (जहां तक ​​मैं बता सकता हूं) में default(byte[]) होगा।

शायद मैं मोंगोडीबी सी # चालक में कुछ तुच्छ देख रहा हूं, मैं MongoCollection<T>.Save(T item) का उपयोग User.PasswordHash या User.PasswordSalt जैसे विशिष्ट गुणों को अपडेट किए बिना कैसे कर सकता हूं? क्या मुझे पहले पूर्ण रिकॉर्ड पुनर्प्राप्त करना चाहिए, वहां "सुरक्षित" गुण अपडेट करें, और इसे वापस लिखें? या क्या अपडेट से कुछ फ़ील्ड को बाहर करने के लिए कोई फैंसी विकल्प है?

अग्रिम धन्यवाद

उत्तर

16

सहेजें (someValue) इस मामले में जहां आप जिसके परिणामस्वरूप रिकॉर्ड है या पूर्ण वस्तु (someValue) बन आपके द्वारा व्यतीत करना चाहते हैं के लिए है।

आप

var query = Query.EQ("_id","123"); 
var sortBy = SortBy.Null; 
var update = Update.Inc("LoginCount",1).Set("LastLogin",DateTime.UtcNow); // some update, you can chain a series of update commands here 

MongoCollection<User>.FindAndModify(query,sortby,update); 
उपयोग कर सकते हैं

विधि।

FindAndModify का उपयोग करके आप निर्दिष्ट कर सकते हैं कि मौजूदा रिकॉर्ड में कौन से फ़ील्ड बदल सकते हैं और बाकी को अकेले छोड़ सकते हैं।

आप एक उदाहरण here देख सकते हैं।

मौजूदा रिकॉर्ड से आपको केवल एक चीज की आवश्यकता होगी, यह _id फ़ील्ड को लोड नहीं किया जाना चाहिए या कभी भी आपके POCO ऑब्जेक्ट में मैप नहीं किया जाना चाहिए।

+1

उनका कहना है कि बाहर के लिए धन्यवाद। लेकिन मेरी अंतर्निहित समस्या अभी भी मौजूद है: मैं अपने टाइप किए गए 'मोंगोकोलेक्शन ' से सभी गुणों को अपडेट करना चाहता हूं, जो कि फ़ील्ड के विशिष्ट ज्ञात सेट को छोड़कर 'टी' के उदाहरण के मानों के साथ हैं। ' अपडेट करें। सब कुछ से (कुछ ऑब्जेक्ट)। Xxcept (x => x.ExceptThis)। Xxcept (x => x.ExceptThat)' – Manny

+2

यह एक कस्टम नौकरी है जिसे आपको लिखने की आवश्यकता होगी (सब कुछ से ..) । BsonMemberMap चलकर और सभी मैप किए गए सदस्यों को प्राप्त करके, क्लाइंट पक्ष पर करना बहुत कठिन नहीं है, फिर यदि आप जानते हैं कि मान बदल गया है तो केवल प्रत्येक से एक अपडेट.Set() बना रहा है। यह गारंटीकृत नहीं है क्योंकि डीबी शायद बदल सकता है क्योंकि आप स्मृति में रिकॉर्ड पढ़ते हैं। –

2

कहां कथन में अधिक मानदंड जोड़ना संभव है। इस तरह:

var db = ReferenceTreeDb.Database; 
var packageCol = db.GetCollection<Package>("dotnetpackage"); 
var filter = Builders<Package>.Filter.Where(_ => _.packageName == packageItem.PackageName.ToLower() && _.isLatestVersion); 
var update = Builders<Package>.Update.Set(_ => _.isLatestVersion, false); 
var options = new FindOneAndUpdateOptions<Package>(); 
packageCol.FindOneAndUpdate(filter, update, options); 
0

अच्छी तरह से mongodb में अद्यतन मूल्य के कई तरीके हैं।

नीचे मैंगोड संग्रह में फ़ील्ड मान को अपडेट करने का सबसे आसान तरीका है।

public string UpdateData() 
     {    
      string data = string.Empty; 
      string param= "{$set: { name:'Developerrr New' } }"; 
      string filter= "{ 'name' : 'Developerrr '}"; 
      try 
      { 
       //******get connections values from web.config file***** 
       var connectionString = ConfigurationManager.AppSettings["connectionString"]; 
       var databseName = ConfigurationManager.AppSettings["database"]; 
       var tableName = ConfigurationManager.AppSettings["table"]; 

       //******Connect to mongodb********** 
       var client = new MongoClient(connectionString); 
       var dataBases = client.GetDatabase(databseName); 
       var dataCollection = dataBases.GetCollection<BsonDocument>(tableName);  

       //****** convert filter and updating value to BsonDocument******* 
       BsonDocument filterDoc = BsonDocument.Parse(filter); 
       BsonDocument document = BsonDocument.Parse(param); 

       //********Update value using UpdateOne method***** 
       dataCollection.UpdateOne(filterDoc, document);     
       data = "Success"; 
      } 
      catch (Exception err) 
      { 
       data = "Failed - " + err; 
      } 
      return data;  
     } 

इस तुम्हारी मदद करेगा उम्मीद :)

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