2015-06-17 14 views
6

Tôi đang sử dụng trình điều khiển MongoDB .Net trong dự án của tôi. Tôi muốn cập nhật tất cả các thuộc tính của đối tượng của tôi được lưu trữ trong MongoDB. Trong tài liệu hướng dẫn, cập nhật được hiển thị như thế này:Cập nhật tất cả các thuộc tính của đối tượng trong MongoDb

var filter = Builders<BsonDocument>.Filter.Eq("i", 10); 
var update = Builders<BsonDocument>.Update.Set("i", 110); 

await collection.UpdateOneAsync(filter, update); 

Nhưng tôi không muốn gọi phương thức Set cho tất cả các tài sản, kể từ khi có nhiều tài sản và có thể nhiều hơn nữa trong tương lai.

Làm cách nào để cập nhật toàn bộ đối tượng bằng trình điều khiển MongoDB .Net?

+0

Yon chỉ sử dụng [** '$ set' **] (http://docs.mongodb.org/manual/reference/operator/update/set/) và các nhà khai thác liên quan (đó là tất cả những người xây dựng trình điều khiển này đang làm) trên các trường bạn thực sự muốn cập nhật. Vì vậy, nếu bạn chỉ cần thay đổi một cái thì bạn liệt kê một cái. Đó có phải là vấn đề của bạn hay là bạn muốn thay đổi 20 trong số 50 thuộc tính trong bản cập nhật của bạn? –

+0

@ user3561036 số thuộc tính được cập nhật không xác định nên tôi ổn với việc cập nhật tất cả chúng cùng một lúc, thậm chí là giá trị vẫn như cũ. – Sefa

+0

Về cơ bản đó là "tài liệu cập nhật" mà không có bất kỳ toán tử nào như '$ set'. Nhưng có một phương pháp trợ giúp hữu ích thực hiện điều này cho bạn thay vì chỉ tuần tự hóa toàn bộ tài liệu. –

Trả lời

12

Bạn có thể làm điều đó với ReplaceOneAsync thay vì UpdateOneAsync.

Bạn cần một bộ lọc để khớp với tài liệu hiện có (bộ lọc có id tài liệu đơn giản nhất) và đối tượng mới.

Hamster hamster = ... 
var replaceOneResult = await collection.ReplaceOneAsync(
    doc => doc.Id == hamster.Id, 
    hamster); 
+1

Nhưng làm thế nào để tôi cung cấp cho họ cùng một ID mà không cần gửi một yêu cầu bổ sung cho cơ sở dữ liệu cho ID đã tồn tại? Am i thiếu cái gì ở đây? – Reynevan

+0

@Reynevan 1. Bạn có thể lấy id từ db. 2. Bạn có thể tự tạo Mã trong mã. – i3arnon

+0

Trong kịch bản của tôi, tôi đang tạo các đối tượng và sau đó thêm chúng vào cơ sở dữ liệu. Khi tôi chạy ứng dụng lần sau, không có gì đảm bảo rằng các đối tượng mà nó tạo ra chưa có ở đó. Nếu tôi cố gắng làm họ khó chịu, họ không phù hợp với '_id'. Nếu tôi nhận được id từ DB đó là một yêu cầu bổ sung cho DB. Tôi có ~ 800 đối tượng mỗi đợt. Điều này dường như không hiệu quả. – Reynevan

-2
var update = new BsonDocument("$set", new BsonDocument(entityType.GetProperties().Where(p => p.Name != "Id").Select(p => new KeyValuePair<string, object>(p.Name, entityType.GetProperty(p.Name).GetValue(task, null))))); 
var options = new UpdateOptions(); 
collection.UpdateOne<MyTask>(item => item.Name == "cheque", update, options); 
+0

Vui lòng nhận xét mã của bạn. Bạn phải giải thích tại sao câu trả lời của bạn là tốt. – JorgeHortelano

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