Điều này có thể liên quan đến một lỗi đã được giới thiệu trong 1.6.0 liên quan đến việc lặp lại với hasNext()
và getNext()
: PHP-1382
. Một bản sửa lỗi đã được hợp nhất thành v1.6
chi nhánh
và sẽ được phát hành vào cuối tuần này dưới dạng 1.6.1.
Điều đó nói rằng, lỗi liên quan đến hasNext()
thực sự là tài liệu cuối cùng trong tập kết quả sẽ bị bỏ lỡ khi lặp lại. Nếu tôi chạy tập lệnh gốc của bạn dựa trên 1.6.0, mảng chứa null
giá trị như phần tử cuối cùng của nó. Với bản sửa lỗi tại chỗ, mảng sẽ chứa tất cả các tài liệu như mong đợi. Tôi không thể tạo lại ngoại lệ mà bạn đang thấy với một trong hai phiên bản.
Ngoại lệ đó thực sự được ném ra từ việc kiểm tra nội bộ cấu trúc dữ liệu C, để đảm bảo rằng đối tượng con trỏ được liên kết đúng với kết nối MongoClient và socket. Xem MONGO_CHECK_INITIALIZED()
lệnh gọi macro trong tệp này
. Hầu hết tất cả các phương thức con trỏ đều kiểm tra xem MongoClient có được liên kết hay không, nhưng hasNext()
là duy nhất ở chỗ nó cũng kiểm tra đối tượng socket (tôi tin rằng các phương pháp khác chỉ cần giả sử một con trỏ với MongoClient cũng có một socket). Nếu ngoại lệ đó thực sự có thể tái tạo đối với bạn và bạn sẵn sàng thực hiện một số gỡ lỗi với tiện ích mở rộng, tôi rất muốn biết kiểm tra nào trong số hai kiểm tra đang gây ra lỗi.
Ngoài ra, bạn cũng nên chỉ định "replicaSet"
tùy chọn khi xây dựng MongoClient. Tên này phải có tên tập hợp bản sao, điều này đảm bảo rằng trình điều khiển có thể bỏ qua các kết nối đến các máy chủ không phải là thành viên của tập bản sao dự định.