Za prvé .getCollection()
metoda vrací základní objekt kolekce Driver takto:
DBCollection collection = mongoTemplate.getCollection("collectionName");
Typ objektu dotazu se tedy může lišit od toho, co používáte, ale jsou zde také některé další věci. Konkrétně .distinct()
vrátí pouze "distant" hodnoty klíče, které jste požadovali, a nevrátí ostatní pole dokumentu. Takže můžete udělat:
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());
Ale to například vrátí "vzorek" jako jeden prvek v seznamu.
Pokud chcete "pole" z odlišné sady, použijte .aggregate()
místo toho. Buď s "prvními" výskyty ostatních hodnot pole pro odlišný klíč:
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);
Nebo skutečné "odlišné" hodnoty více polí tím, že se všechny stanou součástí seskupovacího klíče:
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);
Existují také přímé .aggregate()
metoda již na instancích mongoTemplate, která má řadu pomocných metod pro vytváření potrubí. Ale to by vás mělo nasměrovat alespoň správným směrem.