2013-02-15 38 views
9

Theo phương thức javaDoc, getN() của lớp WriteResult trong MongoDB-java trả về số lượng tài liệu được cập nhật trong toán hạng. Nhưng nó luôn trả về số không, ngay cả khi tài liệu được chèn chính xác.MongoDB: WriteResult.getN() luôn trả về 0?

Tại sao vậy? hoặc tôi hiểu sai?

+0

Nó hoạt động đúng cách. Bạn đang sử dụng phiên bản mongo nào? Các tài liệu được chèn đúng cách trong DB sau thao tác này phải không? – Buchi

+1

có các tài liệu được chèn chính xác! Phiên bản Mongo: 2.2.2 –

+1

Tôi cũng đang tìm kiếm điều tương tự. Nó đang quay trở lại 0. Xem ở đây cũng như http: // stackoverflow.com/questions/10662858/mongodb-java-api-writeresultgetn – btiernay

Trả lời

9

Tôi đã theo ấn tượng rằng đây là hành vi MongoDB bình thường, và không có gì để làm với trình điều khiển Java.

Điều duy nhất tôi có thể tìm thấy trong tài liệu là this:

getLastError.n báo cáo số lượng tài liệu cập nhật hoặc xóa, nếu các hoạt động trước đó là một bản cập nhật hoặc loại bỏ hoạt động.

Một insert được không phải một update hay một remove, n dường như không được xác định và 0 là tốt một giá trị mặc định như bất kỳ. Bạn có thể kiểm tra xem nó một cách dễ dàng đủ trong vỏ Mongo:

> db.test.insert({_id: 'test'}) 
> db.getLastErrorObj() 
{ "n" : 0, "connectionId" : 7, "err" : null, "ok" : 1 } 

Trừ khi tôi là nhầm lẫn, nó không thực sự là một vấn đề: tự hỏi mình, theo đó hoàn cảnh chèn sẽ thất bại (trừ, nói rằng, một kết nối thất bại). Người duy nhất tôi có thể nghĩ là vi phạm ràng buộc duy nhất, điều này sẽ dẫn đến một ngoại lệ. Vì vậy, gần như theo định nghĩa, thực tế là bạn nhận được một ví dụ WriteResult ở tất cả các phương tiện hoạt động đã thành công và một tài liệu đã được chèn vào.

Một vài lưu ý:

  • tranh luận trước đây của tôi xoay quanh WriteConcern của bạn là đủ cao mà lỗi được báo cáo. Ví dụ: nếu bạn đang sử dụng WriteConcern.NONE, sẽ không có ngoại lệ nào được nêu ra.
  • nếu số tài liệu được cập nhật là tuyệt đối phải cho bạn, bạn luôn có thể sử dụng save thay vì insert. Không phải rất sạch sẽ, nhưng nó cư xử theo cách bạn mong đợi.
+2

Tôi nghĩ rằng có một vấn đề với hành vi này, bởi vì Javadoc cho 'getN()' nói "* Lấy trường" n ", chứa số lượng tài liệu bị ảnh hưởng trong thao tác ghi. * Nếu bạn làm [không có thứ tự chèn] (http://docs.mongodb.org/manual/reference/method/db.collection.insert/#perform-an-unordered-insert), nó có giá trị để biết nếu có gì thay đổi và sử dụng 'getN() 'sau đó giới thiệu một lỗi trong ứng dụng của bạn bằng cách luôn trả về 0. Một giải pháp hợp lý (ngoài việc sửa Javadoc) có thể làm cho' getN() 'ném một ngoại lệ cho chèn, hoặc không bao gồm phương thức ngay từ đầu! – Zero3

+0

@ Zero3 Bổ sung, WriteResult bao gồm số lượng tài liệu được chèn từ 2.6, tôi tin rằng bạn chỉ cần gọi getField với tên đúng. Cuối cùng, javadoc gần đây nhất không nói gì về trường n là gì chỉ nói 'có được lĩnh vực'. Trong khi đó không phải là hữu ích khủng khiếp, nó hầu như không chính xác. Và nếu bạn nhìn vào tài liệu mongodb chính thức cho trường n, nó khá rõ ràng rằng chèn sẽ mang lại một giá trị n là 0 - có lẽ không phải là hành vi tốt nhất, nhưng đúng theo thông số kỹ thuật. Chỉ cần sử dụng đúng trường. –

+0

[WriteResult] (http://api.mongodb.org/java/current/com/mongodb/WriteResult.html) không có chức năng như vậy trong phiên bản mới nhất, và mô tả của 'getN()' là chính xác như tôi đã viết . Tự kiểm tra :). – Zero3

4

Lưu ý rằng bất kể trạng thái MongoDB documentation, phương thức WriteResult.getN() luôn trả về 0 cho chèn bằng trình điều khiển Java, bất kể số lượng đối tượng được chèn. Mã nguồn để thiết lập trường "n" trong 2.12.3 của trình điều khiển Java:

if (type == INSERT) { 
    commandResult.put("n", 0); 
} else if (type == REMOVE) { 
    commandResult.put("n", bulkWriteResult.getRemovedCount()); 
} else if (type == UPDATE || type == REPLACE) { 
    commandResult.put("n", bulkWriteResult.getMatchedCount() + bulkWriteResult.getUpserts().size()); 
    if (bulkWriteResult.getMatchedCount() > 0) { 
    commandResult.put("updatedExisting", true); 
    } else { 
    commandResult.put("updatedExisting", false); 
    } 
    if (!bulkWriteResult.getUpserts().isEmpty()) { 
    commandResult.put("upserted", bulkWriteResult.getUpserts().get(0).getId()); 
    } 
} 

Nhưng lỗi được báo cáo chính xác qua Ngoại lệ. Ví dụ: MongoException sẽ được ném khi chèn tài liệu vi phạm một chỉ mục duy nhất, nếu WriteConcern được chỉ định ít nhất là ACKNOWLEDGED

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