D'une part, le .getCollection()
renvoie l'objet de base de la collection Driver comme suit :
DBCollection collection = mongoTemplate.getCollection("collectionName");
Ainsi, le type d'objet de requête peut être différent de celui que vous utilisez, mais il y a aussi d'autres choses. A savoir que .distinct()
ne renvoie que les valeurs "distint" de la clé que vous avez demandée, et ne renvoie pas les autres champs du document. Vous pourriez donc :
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());
Mais cela ne renverra que "sample" en tant qu'élément unique dans la liste par exemple.
Si vous voulez les "champs" d'un ensemble distinct, utilisez le .aggregate()
méthode à la place. Avec soit les "premières" occurrences des autres valeurs de champ pour la clé distincte :
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);
Ou les valeurs "distinctes" réelles de plusieurs champs, en les intégrant toutes à la clé de regroupement :
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);
Il y a aussi un .aggregate()
direct méthode sur les instances mongoTemplate déjà, qui a un certain nombre de méthodes d'assistance pour créer des pipelines. Mais cela devrait au moins vous orienter dans la bonne direction.