2012-02-22 44 views
5

Sử dụng MongoDB và trình điều khiển 10gen C# mới nhất (CSharpDriver-1.3.1.4349), tôi đang cố thực hiện cập nhật "tại chỗ" và lấy lại # tài liệu được thực hiện trong kết quả.SafeModeResult là null sau khi cập nhật

public static long SaveListings(string state, bool isActive, DateTime updateDate) 
{ 
    var result = Collection().Update(
    Query.And(
     Query.EQ("State", state), 
     Query.And(
      Query.EQ("IsActive", isActive), 
      Query.LT("UpdateDate", updateDate))), 
    Update.Set("IsActive", false), UpdateFlags.Multi); 
    return result != null ? result.DocumentsAffected : -1; 
} 

Kết quả không có lý do nào. Nếu tôi được làm điều này từ giao diện điều khiển, tôi có thể nhận được số hàng thực hiện bằng cách làm này:

db.Listing.update({ State: state.Abbreviation, IsActive: true, UpdateDate: { $lt: expiredDate } }, { $set: { IsActive: false } }, false, true); 
var numRows = db.getLastErrorObj().n; 

Bất kỳ ý tưởng những gì tôi đang làm sai hoặc đây là một lỗi trong trình điều khiển C#?

Trả lời

6

Cập nhật chứa phương thức quá tải mất SafeMode. Chỉ cần thêm mã đó vào mã của bạn dưới dạng thông số thứ tư cho bản cập nhật của bạn và không được rỗng:

... 
UpdateFlags.Multi, 
SafeMode.True); 

Đó không phải lỗi trình điều khiển, nó hoạt động như mong đợi. Mongodb không đợi tài liệu nếu được chèn vào mà không có chế độ an toàn (do đó trình điều khiển trả về null), nhưng nếu bạn nói SafeMode = true - bạn buộc mongodb đợi cho đến khi tài liệu được chèn vào.

+0

Cảm ơn! Tôi biết chế độ an toàn hoạt động như thế nào tuy nhiên tôi đã giả định không chính xác rằng kết nối sẽ sử dụng chế độ an toàn theo mặc định. – Justin

+0

Tôi đã có cùng một vấn đề, hãy lưu ý trình điều khiển hiện tại có vấn đề với xác thực khi sử dụng getLastError một cách rõ ràng. Robert (dev tại 10gen) đề xuất sử dụng SafeMode.True thay vì cho đến khi prob được sửa. xem https://jira.mongodb.org/browse/CSHARP-390 – sambomartin

4

Thực hiện chèn và cập nhật mà không chỉ định chế độ an toàn mang lại giá trị rỗng vì chúng hoạt động không đồng bộ - đơn giản là không biết cách chèn hoặc cập nhật.

Vì vậy, hãy thêm ví dụ: SafeMode.True là đối số cuối cùng trong chèn và cập nhật trong trường hợp bạn quan tâm đến kết quả. Điều này sẽ làm cho tài xế vấn đề một lệnh getLastError, mà khối cho đến khi chèn/cập nhật đã hoàn thành:

var result = collection.Update(query, update, SafeMode.True); 

Bạn có thể đọc một số khoảng hơn getLastError và khác biệt an toàn chế độ here (general)here (SafeMode with the C# driver).

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