2017-07-06 5 views
0

aggregate Methode der MongoTemplate kehrt AggregationResults<T>, wo T die Klasse zu sein, die Sammlung Mongo entspricht.Frühling MongoTemplate - Mapping Aggregation Ergebnis Sammlungen (z Liste und Karte)

Manchmal möchten wir nur die einzelne (sagen Eigenschaft abc) oder ein paar Eigenschaften (pqr und xyz) aus dieser Sammlung abhängig von bestimmten Kriterien. In diesen Fällen können wir entweder die gesamte Sammlung in die Klasse T abrufen oder eine neue Klasse erstellen, die Eigenschaften enthält (abc) oder (pqr, xyz).

Gibt es eine Möglichkeit, diese einzelnen Eigenschaften List<String> oder zwei Eigenschaften als Schlüssel/Wert-Paar in HashMap<String, String> zuzuordnen?

Antwort

2

Verwenden Sie BasicDBObject (unterstützt von)/Document (ab Version 2.0.0 Frühling Mongo) zusammen mit Java 8 Stream-Methoden, um sie in Sammlungstypen zu analysieren.

Single Property (abc) - Liste Typ

Aggregation aggregation = Aggregation.newAggregation(Aggregation.project("abc")); 
List<String> singleResults = mongoOperations.aggregate(aggregation, "collectioname", BasicDBObject.class).getMappedResults().stream().map(item -> item.getString("abc")).collect(Collectors.toList()); 

Mehrere Eigenschaften (pqr, xyz) - Kartentyp

Aggregation aggregation = Aggregation.newAggregation(Aggregation.project("pqr, xyz")); 
List<Map> multipleResults = mongoOperations.aggregate(aggregation,"collectioname", BasicDBObject.class).getMappedResults().stream().map (item -> (LinkedHashMap) item).collect(Collectors.toList()); 

Update (Lesen vom Server)

Single Property (abc) - Listentyp

Aggregation aggregation = Aggregation.newAggregation(Aggregation.group().push("abc").as("abc")); 
List<String> singleResults = (List<String>) mongoOperations.aggregate(aggregation, "collectioname", BasicDBObject.class).getUniqueMappedResult().get("abc"); 

Mehrere Eigenschaften (pqr, xyz) - Kartentyp

Aggregation aggregation = Aggregation.newAggregation(Aggregation.group().push("pqr").as("pqr").push("xyz").as("xyz")); 
Map multipleResults = mongoOperations.aggregate(aggregation,"collectioname", BasicDBObject.class).getUniqueMappedResult(); 
+0

Was Sie vorschlagen, ist das mehr Stil Weise Iterieren Aggregation Ergebnisse (lassen Sie mich wissen, wenn auf diese Weise effizienter als Iterieren ist mit herkömmlichen foreach-Schleife). Ich suchte nach einer Lösung, wo die tatsächliche Verarbeitung in MongoDB Server stattfindet. – Harish

+0

Okay, ich habe die Antwort basierend auf Ihrem Kommentar aktualisiert. Bitte zögern Sie nicht zu kritisieren. – Veeram