2013-02-13 132 views
9

我想用C#驅動程序更新(類型)MongoDB集合中的一行。在處理MongoCollection<User>類型的特定集合的數據時,我傾向於避免從集合中檢索敏感數據(鹽,密碼哈希等)。MongoDB:只更新特定字段

現在我試圖更新User實例。但是,我從來沒有真正檢索到敏感數據,所以我想在檢索模型實例(據我所知)中,這個數據應該是default(byte[]),然後我應用修改並將新數據提交給集合。

也許我在監督MongoDB的C#驅動程序怎麼用MongoCollection<T>.Save(T item)沒有更新的具體性能,如User.PasswordHashUser.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

感謝您指出了這一點。但是我的根本問題仍然存在:我希望更新我的類型'MongoCollection '中的所有屬性和'T'實例的值,除了一組特定的已知字段。 'Update .EverythingFrom(someObject).Except(x => x.ExceptThis).Except(x => x.ExceptThat)' – Manny 2013-02-16 10:28:21

+2

這是您需要編寫的一項自定義作業(EverythingFrom ..) 。在客戶端不難做到,通過遍歷BsonMemberMap並獲取所有映射成員,然後只有在知道該值發生更改時才從每個成員創建Update.Set()。它不能保證一致性,因爲自從您將記錄讀入內存之後,數據庫可能發生了變化。 – 2013-02-25 16:48:14

2

可以在Where語句中添加更多標準。像這樣:

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中的值。

下面是我選擇更新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;  
     } 

希望這將幫助你:)