2013-02-13 36 views
9

Tôi đang cố cập nhật một hàng trong bộ sưu tập MongoDB (đã nhập) bằng trình điều khiển C#. Khi xử lý dữ liệu của bộ sưu tập cụ thể loại MongoCollection<User>, tôi có xu hướng tránh truy xuất dữ liệu nhạy cảm từ bộ sưu tập (muối, mật khẩu băm, v.v.)MongoDB: chỉ cập nhật các trường cụ thể

Bây giờ tôi đang cố gắng cập nhật phiên bản User. Tuy nhiên, tôi chưa bao giờ thực sự lấy dữ liệu nhạy cảm, vì vậy tôi đoán dữ liệu này sẽ là default(byte[]) trong trường hợp mô hình đã truy xuất (theo như tôi có thể biết) trước khi tôi áp dụng sửa đổi và gửi dữ liệu mới cho bộ sưu tập.

Có lẽ tôi đang giám sát điều gì đó tầm thường trong trình điều khiển C# MongoDB C# làm cách nào tôi có thể sử dụng MongoCollection<T>.Save(T item) mà không cập nhật các thuộc tính cụ thể như User.PasswordHash hoặc User.PasswordSalt? Tôi có nên truy xuất bản ghi đầy đủ trước, cập nhật các thuộc tính "an toàn" ở đó và ghi lại không? Hoặc là có một tùy chọn ưa thích để loại trừ một số lĩnh vực từ bản cập nhật?

Cảm ơn trước

Trả lời

16

Lưu (someValue) là dành cho trường hợp bạn muốn ghi lại kết quả là hoặc trở nên đầy đủ các đối tượng (someValue) bạn thông qua vào.

Bạn có thể sử dụng

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); 

phương pháp.

Sử dụng FindAndModify bạn có thể chỉ định chính xác trường nào trong bản ghi hiện có để thay đổi và để phần còn lại một mình.

Bạn có thể xem ví dụ here.

Điều duy nhất bạn cần từ bản ghi hiện có sẽ là _id của nó, 2 trường bí mật không cần phải được tải hoặc bao giờ được ánh xạ trở lại đối tượng POCO của bạn.

+1

Cảm ơn đã chỉ ra rằng. Nhưng vấn đề cơ bản của tôi vẫn tồn tại: Tôi muốn cập nhật tất cả các thuộc tính từ 'MongoCollection ' đã nhập của tôi với các giá trị của một thể hiện của 'T', ngoại trừ một nhóm trường đã biết cụ thể. Một cái gì đó dọc theo dòng 'Update .EverythingFrom (someObject) .Except (x => x.ExceptThis) .Except (x => x.ExceptThat)' – Manny

+2

Đây là công việc tùy chỉnh bạn cần viết (EverythingFrom ..) . Không quá khó để làm ở phía khách hàng, bằng cách đi bộ BsonMemberMap và nhận được tất cả các thành viên được ánh xạ, sau đó chỉ xây dựng một Update.Set() từ mỗi nếu bạn biết rằng giá trị thay đổi. Nó không được đảm bảo mạch lạc vì DB có thể đã thay đổi kể từ khi bạn đọc bản ghi vào bộ nhớ mặc dù. –

2

Có thể thêm các tiêu chí khác vào Câu lệnh ở đâu. Như thế này:

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

Có nhiều cách để cập nhật giá trị trong mongodb.

Dưới đây là một trong những cách đơn giản nhất tôi chọn để cập nhật giá trị trường trong bộ sưu tập 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;  
     } 

Hy vọng điều này sẽ giúp bạn :)

Các vấn đề liên quan