2012-09-18 30 views
6

Tôi đang sử dụng lái xe nha phiến Java để truy vấn một MongoDB có chứa một tập hợp các hình thức sau đây:Query MongoDB cho giá trị khác biệt ra lệnh

MyCollection { 
    TypeA 
    TypeB 
} 

Tôi muốn lấy tất cả giá trị khác biệt của TypeB mà tôi sử dụng như sau mã:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 
List typeBs = myCol.distinct("TypeB"); 

Mã trên hoạt động như mong đợi nhưng danh sách các giá trị riêng biệt tất nhiên không được sắp xếp.

tôi đã thử nghiệm với đoạn mã sau:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 
DBObject orderBy = new BasicDBObject("$orderby", new BasicDBObject("TypeB", 1); 
List typeBs = myCol.distinct("TypeB", orderBy); 

Nhưng trong trường hợp này danh sách là trống rỗng, nơi những giả định của tôi sai?

CẬP NHẬT

Bằng việc sử dụng CLI tôi phát hiện ra rằng các truy vấn sau đây trả lại kết quả mong đợi:

> db.mycollection.find({$query : {}, $orderby : { TypeB : 1 }}) 

Vì vậy, tôi điều chỉnh mã của tôi phù hợp:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 

BasicDBObject ascending = new BasicDBObject("TypeB", 1); 
BasicDBObject filter = new BasicDBObject(); 
filter.put("$query", new BasicDBObject()); 
filter.put("$orderby", ascending); 

List typeBs = myCol.distinct("TypeB", filter); 

Tuy nhiên kết quả chứa 0 mục!

Điều gì thực sự làm cho tôi bối rối là cùng một truy vấn hoạt động nếu tôi sử dụng .find thay vì .distinct:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 

BasicDBObject ascending = new BasicDBObject("TypeB", 1); 
BasicDBObject filter = new BasicDBObject(); 
filter.put("$query", new BasicDBObject()); 
filter.put("$orderby", ascending); 

myCol.find(filter).hasNext(); <-- Evaluates to TRUE 

Tại sao nó rằng bộ lọc không hoạt động khi sử dụng biệt phương pháp luận gọi điện?

Trả lời

5

tham số DBObject thứ hai của DBCollection.distinct() là đối tượng truy vấn, được sử dụng để xác định tiêu chí khớp. Để sắp xếp các phân biệt danh sách, bạn có thể sử dụng:

List typeBs = myCol.distinct("TypeB"); 
java.util.Collections.sort(typeBs); 
+2

Vâng, đây là cách giải quyết mà tôi hiện đang sử dụng. Nhưng tôi tin rằng tôi sẽ có thể thêm truy vấn để đặt hàng kết quả trước khi chọn các giá trị khác biệt. – aksamit

+2

nếu bạn muốn sắp xếp ở cấp mongodb, trong trường hợp bạn đang làm giới hạn – nightograph

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