Po pierwsze .getCollection()
metoda zwraca podstawowy obiekt kolekcji Driver w następujący sposób:
DBCollection collection = mongoTemplate.getCollection("collectionName");
Zatem typ obiektu zapytania może różnić się od tego, którego używasz, ale są też inne rzeczy. Mianowicie, że .distinct()
zwraca tylko wartości „distint” klucza, o który prosiłeś, i nie zwraca innych pól dokumentu. Możesz więc zrobić:
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 na przykład zwróci tylko "próbkę" jako pojedynczy element na liście.
Jeśli chcesz, aby "pola" pochodziły z odrębnego zestawu, użyj .aggregate()
zamiast metody. Z jednym z „pierwszych” wystąpień innych wartości pól dla odrębnego klucza:
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);
Lub rzeczywiste „różne” wartości wielu pól, czyniąc je częścią klucza grupującego:
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);
Istnieje również bezpośrednia .aggregate()
metoda na instancjach mongoTemplate, która ma wiele metod pomocniczych do budowania potoków. Ale to powinno wskazać ci przynajmniej właściwy kierunek.