Đối với một điều, .getCollection()
phương thức trả về đối tượng thu thập trình điều khiển cơ bản như sau:
DBCollection collection = mongoTemplate.getCollection("collectionName");
Vì vậy, loại đối tượng truy vấn có thể khác với những gì bạn đang sử dụng, nhưng cũng có một số thứ khác. Cụ thể là .distinct()
chỉ trả về các giá trị "chưng cất" của khóa mà bạn đã yêu cầu và không trả về các trường khác của tài liệu. Vì vậy, bạn có thể làm:
Criteria criteria = new Criteria();
criteria.where("dataset").is("d1");
Query query = new Query();
query.addCriteria(criteria);
List list = mongoTemplate.getCollection("collectionName")
.distinct("source",query.getQueryObject());
Nhưng điều đó sẽ chỉ trả về "mẫu" dưới dạng một phần tử duy nhất trong danh sách.
Nếu bạn muốn các "trường" từ một tập hợp riêng biệt thì hãy sử dụng .aggregate()
thay vào đó. Với lần xuất hiện "đầu tiên" của các giá trị trường khác cho khóa riêng biệt:
DBCollection colllection = mongoTemplate.getCollection("collectionName");
List<DBObject> pipeline = Arrays.<DBObject>asList(
new BasicDBObject("$match",new BasicDBObject("dataset","d1")),
new BasicDBObject("$group",
new BasicDBObject("_id","$source")
.append("name",new BasicDBObject("$first","$name"))
.append("description", new BasicDBObject("$first","$description"))
)
);
AggregationOutput output = colllection.aggregate(pipeline);
Hoặc các giá trị "riêng biệt" thực tế của nhiều trường, bằng cách đặt tất cả chúng thành một phần của khóa nhóm:
DBCollection colllection = mongoTemplate.getCollection("collectionName");
List<DBObject> pipeline = Arrays.<DBObject>asList(
new BasicDBObject("$match",new BasicDBObject("dataset","d1")),
new BasicDBObject("$group",
new BasicDBObject("_id",
new BasicDBObject("source","$source")
.append("name","$name")
.append("description","$description")
)
)
);
AggregationOutput output = colllection.aggregate(pipeline);
Ngoài ra còn có một .aggregate()
trực tiếp phương thức trên các cá thể mongoTemplate đã có, có một số phương thức trợ giúp để xây dựng đường ống. Nhưng điều này ít nhất sẽ giúp bạn đi đúng hướng.