Không chắc chắn những gì chính xác bạn muốn. Về cơ bản có hai loại cập nhật trong MongoDB:bạn có thể thực hiện cập nhật nguyên tử hoặc thay thế tài liệu .
Thay thế tài liệu thường dễ dàng hơn , bởi vì nó cho phép bạn sử dụng các phép toán C # tiêu chuẩn để thực hiện các sửa đổi và nó sẽ đánh giá lại các thuộc tính đã tạo và những thứ tương tự:
var user = new User { Name = "John Doe", Quests =
new Dictionary<string, Tuple<string, string>> {
{ "hoho", new Tuple<string, string>("A", "A-Item") } } };
users.InsertOneAsync(user).Wait();
user.Quests = new Dictionary<string, Tuple<string, string>> {
{ "hoho Modified", new Tuple<string, string>("B", "B-Item") } };
users.ReplaceOneAsync(p => p.Id == user.Id, user);
Tuy nhiên, đôi khi bắt buộc phải sử dụng các công cụ sửa đổi nguyên tử, chẳng hạn như $push
, $pull
, $set
, $addToSet
, v.v. vì những lo ngại về tính đồng thời. Tôi thường coi việc thực hiện các thao tác phức tạp trên các đối tượng được nhúng phức tạp theo cách này là một ý tưởng tồi, vì có khả năng cao là tính nhất quán của đối tượng (theo nghĩa ACID hoặc 'đối tượng bất biến' ) không thể được kiểm tra.
Giả sử một người dùng không được phép có nhiều hơn 3 nhiệm vụ hoạt động cùng một lúc, ai đảm bảo quy tắc này được tuân thủ? Đó thường là trách nhiệm của mã và các bất biến phức tạp không thể được kiểm tra bởi cơ sở dữ liệu.
Nếu bạn vẫn muốn sử dụng các toán tử nguyên tử đó, tôi khuyên bạn nên đặt một câu hỏi mới vì ở đó nó thực sự phụ thuộc vào chi tiết (từ điển, theo mặc định, được tuần tự hóa dưới dạng tài liệu, tuple dưới dạng mảng và chúng yêu cầu các sửa đổi nguyên tử khác nhau trong MongoDB). Ví dụ:để thêm một mục mới vào từ điển, hãy sử dụng $set
:
users.UpdateOneAsync(p => p.Id == user.Id,
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));