Om te beginnen de .getCollection()
methode retourneert het standaard Driver-verzamelingsobject als volgt:
DBCollection collection = mongoTemplate.getCollection("collectionName");
Het type query-object kan dus verschillen van wat u gebruikt, maar er zijn ook enkele andere dingen. Namelijk dat .distinct()
retourneert alleen de "distint"-waarden van de sleutel waar u om hebt gevraagd, en retourneert geen andere velden van het document. Dus je zou kunnen doen:
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());
Maar dat zal bijvoorbeeld alleen "sample" retourneren als een enkel element in de lijst.
Als je de "velden" van een aparte set wilt, gebruik dan de .aggregate()
methode in plaats daarvan. Met ofwel de "eerste" voorkomens van de andere veldwaarden voor de distinctieve sleutel:
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);
Of de werkelijke "verschillende" waarden van meerdere velden, door ze allemaal onderdeel te maken van de groeperingssleutel:
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);
Er zijn ook een directe .aggregate()
methode al op mongoTemplate-instanties, die een aantal hulpmethoden heeft om pijplijnen te bouwen. Maar dit zou je in ieder geval in de goede richting moeten wijzen.