2012-06-05 8 views
7

Khi thực hiện một truy vấn trong MongoDb, tôi cần lấy tổng số tất cả các kết quả phù hợp, cùng với các tài liệu như một tập hợp con có giới hạn/phân trang.mongodb được đếm mà không lặp lại tìm

Tôi có thể đạt được mục tiêu với hai truy vấn, nhưng tôi không thấy cách thực hiện điều này bằng một truy vấn. Tôi hy vọng có một tính năng mongo, trong một số ý nghĩa, tương đương với SQL_CALC_FOUND_ROWS, vì nó có vẻ như quá mức cần phải chạy truy vấn hai lần. Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời. Cảm ơn!

EDIT: Đây là mã Java để thực hiện ở trên.

 DBCursor cursor = collection.find(searchQuery).limit(10); 
    System.out.println("total objects = " + cursor.count()); 

Trả lời

3

Tôi không chắc chắn ngôn ngữ mà bạn đang sử dụng, nhưng bạn thường có thể gọi một phương thức count trên con trỏ đó là kết quả của một truy vấn find và sau đó sử dụng cùng một con trỏ để có được những tài liệu chính mình.

+0

cảm ơn sự giúp đỡ của bạn, nó hoạt động như một sự quyến rũ. Tôi đang sử dụng Java và con trỏ có một phương pháp đếm. – adamSpline

+7

Điều này không hoàn toàn chính xác. Câu hỏi hỏi làm thế nào để làm điều đó với một * truy vấn *. Sử dụng 'cursor.count()' thực sự chỉ ủy nhiệm truy vấn thứ hai cho trình điều khiển máy khách, nhưng truy vấn thứ hai vẫn được thực hiện. – Raman

2

Không chỉ quá tải để chạy truy vấn hai lần mà còn có nguy cơ không nhất quán. Bộ sưu tập có thể thay đổi giữa hai truy vấn hoặc mỗi truy vấn có thể được định tuyến đến một đồng nghiệp khác trong tập bản sao, có thể có các phiên bản khác nhau của bộ sưu tập. Hàm count() trên con trỏ (trong JavaScript MongoDB) thực sự chạy một truy vấn khác, bạn có thể thấy điều đó bằng cách gõ "cursor.count" (không có dấu ngoặc đơn), vì vậy nó không tốt hơn chạy hai truy vấn.

Trong trình điều khiển C++, con trỏ thậm chí không có chức năng "đếm". Có "itcount", nhưng nó chỉ vòng qua con trỏ và lấy tất cả các kết quả, mà không phải là những gì bạn muốn (vì lý do hiệu suất). Trình điều khiển Java cũng có "itcount", và ở đó tài liệu nói rằng nó chỉ nên được sử dụng để kiểm tra.

Dường như không có cách nào để thực hiện "tìm một số và nhận tổng số" một cách nhất quán và hiệu quả.