2011-11-21 36 views
6

Từ các tài liệu C#:MongoDB C# collection.Save vs Insert + Cập nhật

Các phương thức Save là sự kết hợp của Insert và Update. Nếu thành viên Id của tài liệu có một giá trị, thì nó được giả định là một tài liệu hiện có và Lưu các cuộc gọi Cập nhật trên tài liệu (thiết lập cờ Upsert chỉ trong trường hợp nó thực sự là một tài liệu mới sau khi tất cả).

Tôi đang tạo ID của mình theo cách thủ công trong lớp cơ sở mà tất cả các đối tượng miền của tôi kế thừa từ đó. Vì vậy, tất cả các đối tượng miền của tôi có một ID khi chúng được chèn vào MongoDB.

Câu hỏi là, tôi có nên sử dụng bộ sưu tập hay không. Hãy giữ và giữ giao diện của tôi đơn giản hoặc thực hiện điều này thực sự dẫn đến một số phí trong cuộc gọi Lưu (với cờ Upsert), và tôi có nên sử dụng bộ sưu tập này không.

Điều tôi đang nghĩ là phương pháp Save lần đầu tiên gọi Update và sau đó tìm ra đối tượng mới của tôi không tồn tại ở vị trí đầu tiên, sau đó gọi Chèn thay thế. Liệu tôi có sai? Có ai đã thử nghiệm điều này không?

Lưu ý: Tôi chèn dữ liệu hàng loạt với InsertBatch, vì vậy các gói dữ liệu lớn sẽ không thành vấn đề trong trường hợp này.

Chỉnh sửa, Theo dõi

Tôi đã viết một bài kiểm tra nhỏ để tìm hiểu xem gọi Cập nhật với Upsert cờ đã có một số chi phí để Insert có thể được tốt hơn. Hóa ra là chúng chạy cùng tốc độ. Xem mã thử nghiệm của tôi dưới đây. MongoDbServer và IMongoDbServer là giao diện chung của riêng tôi để cô lập cơ sở lưu trữ.

IMongoDbServer server = new MongoDbServer(); 
Stopwatch sw = new Stopwatch(); 
long d1 = 0; 
long d2 = 0; 
for (int w = 0; w <= 100; w++) 
{ 
    sw.Restart(); 
    for (int i = 0; i <= 10000; i++) 
    { 
     ProductionArea area = new ProductionArea(); 
     server.Save(area); 
    } 
    sw.Stop(); 
    d1 += sw.ElapsedMilliseconds; 
    sw.Restart(); 
    for (int i = 0; i <= 10000; i++) 
    { 
     ProductionArea area = new ProductionArea(); 
     server.Insert(area); 
    } 
    sw.Stop(); 
    d2 += sw.ElapsedMilliseconds; 
} 
long a1 = d1/100; 
long a2 = d2/100; 

Trả lời

12

Phương thức lưu là không sẽ thực hiện hai chuyến đi đến máy chủ.

Phương pháp phỏng đoán là: nếu tài liệu đang được lưu không có giá trị cho trường _id, thì giá trị được tạo cho trường đó và sau đó Chèn được gọi. Nếu tài liệu được lưu có giá trị khác 0 cho _id, thì Update được gọi với cờ Upsert, trong trường hợp đó là tùy thuộc vào máy chủ để quyết định có nên thực hiện Chèn hay Cập nhật.

Tôi không biết liệu Upsert có đắt hơn Chèn hay không. Tôi nghi ngờ họ gần như giống nhau và những gì thực sự quan trọng là một trong hai cách nó là một chuyến đi vòng mạng duy nhất.

Nếu bạn biết đó là tài liệu mới, bạn cũng có thể gọi Chèn. Và việc gọi InsertBatch là cách hiệu suất cao hơn gọi nhiều Phụ trang riêng lẻ. Vì vậy, chắc chắn thích InsertBatch để Lưu.

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