От една страна .getCollection()
метод връща основния обект за събиране на драйвери по следния начин:
DBCollection collection = mongoTemplate.getCollection("collectionName");
Така че типът обект на заявка може да е различен от това, което използвате, но има и някои други неща. А именно това .distinct()
връща само "различните" стойности на ключа, който сте поискали, и не връща други полета на документа. Така че можете да направите:
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());
Но това ще върне само "проба" като единичен елемент в списъка например.
Ако искате „полетата“ от отделен набор, използвайте .aggregate()
метод вместо това. С „първото“ появяване на стойностите на другите полета за отделния ключ:
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);
Или действителните „отделни“ стойности на множество полета, като ги направите част от ключа за групиране:
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);
Има и директен .aggregate()
метод на екземпляри на mongoTemplate вече, който има редица помощни методи за изграждане на тръбопроводи. Но това поне трябва да ви насочи в правилната посока.