2013-08-20 32 views
5

Sử dụng MongoDB console tôi có thể viết một truy vấn MongoDB có nguồn gốc sử dụng khóa riêng biệt với một loại như thế này:lái xe MongoDB Java: khác biệt với loại

db.mycollection.distinct('mykey').sort('mykey', 1) 

Dùng trình điều khiển Java Tôi mong chờ để có thể viết cùng một truy vấn như thế này:

myCollection.distinct("myKey").sort(new BasicDBObject("myKey", 1)); 

Tuy nhiên, điều này không làm việc vì lợi nhuận DBCollection#distinct()List và không gõ DBCursor như DBCollection#find().

Làm cách nào để viết truy vấn riêng biệt bằng cách sắp xếp bằng trình điều khiển Java?

Trả lời

12

MongoDB không hỗ trợ sắp xếp phía máy chủ với lệnh distinct. Điều đang xảy ra trong bảng điều khiển là cuộc gọi distinct('myKey') trả về một mảng và sau đó bạn đang gọi phương thức JavaScript sort trên mảng đó trả về phiên bản được sắp xếp của mảng. Các thông số bạn chuyển vào sort bị bỏ qua.

Để thực hiện điều tương đương trong Java bạn sẽ làm gì:

List myKeys = myCollection.distinct("myKey"); 
java.util.Collections.sort(myKeys); 

Để có được chìa khóa duy nhất sử dụng một server-side loại bạn có thể sử dụng aggregate. Dưới đây là cách bạn thực hiện điều đó trong trình bao:

db.mycollection.aggregate([ 
    { $group: {_id: '$myKey' }}, 
    { $sort: {_id: 1}} 
]) 

Tuy nhiên, khi tôi thử nghiệm điều này, cách tiếp cận phân loại phía máy khách đơn giản thực hiện tốt hơn nhiều.

+0

Cảm ơn, làm cho tinh thần. Tôi đoán phân loại ở phía khách hàng là tốt, trừ khi cần phải phân trang cho một tập hợp lớn các kết quả. (sẽ quay lại và gửi tiền thưởng sau). –

0

Bạn thực sự có thể sử dụng javascript tinh khiết

db.mycollection.distinct('mykey').sort() 

hoặc vượt qua một chức năng so sánh để biết thêm chi tiết hóa sắp xếp:

db.users.distinct('mykey').sort(function(a, b){return a >b}) 

Thử nghiệm trên robomongo

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