|
| 1 | +package com.mongodb.quickstart; |
| 2 | + |
| 3 | +import com.mongodb.client.*; |
| 4 | +import org.bson.Document; |
| 5 | +import org.bson.conversions.Bson; |
| 6 | +import org.bson.json.JsonWriterSettings; |
| 7 | + |
| 8 | +import java.util.ArrayList; |
| 9 | +import java.util.Arrays; |
| 10 | +import java.util.function.Consumer; |
| 11 | +import java.util.logging.Level; |
| 12 | +import java.util.logging.Logger; |
| 13 | + |
| 14 | +import static com.mongodb.client.model.Accumulators.push; |
| 15 | +import static com.mongodb.client.model.Accumulators.sum; |
| 16 | +import static com.mongodb.client.model.Aggregates.*; |
| 17 | +import static com.mongodb.client.model.Filters.eq; |
| 18 | +import static com.mongodb.client.model.Projections.*; |
| 19 | +import static com.mongodb.client.model.Sorts.descending; |
| 20 | + |
| 21 | +public class AggregationFramework { |
| 22 | + |
| 23 | + public static void main(String[] args) { |
| 24 | + Logger.getLogger("org.mongodb.driver").setLevel(Level.WARNING); |
| 25 | + String connectionString = System.getProperty("mongodb.uri"); |
| 26 | + try (MongoClient mongoClient = MongoClients.create(connectionString)) { |
| 27 | + MongoDatabase db = mongoClient.getDatabase("sample_training"); |
| 28 | + MongoCollection<Document> zips = db.getCollection("zips"); |
| 29 | + MongoCollection<Document> posts = db.getCollection("posts"); |
| 30 | + threeMostPopulatedCitiesInTexas(zips); |
| 31 | + threeMostPopularTags(posts); |
| 32 | + } |
| 33 | + } |
| 34 | + |
| 35 | + /** |
| 36 | + * find the 3 most densely populated cities in Texas. |
| 37 | + * @param zips sample_training.zips collection from the MongoDB Sample Dataset in MongoDB Atlas. |
| 38 | + */ |
| 39 | + private static void threeMostPopulatedCitiesInTexas(MongoCollection<Document> zips) { |
| 40 | + Bson match = match(eq("state", "TX")); |
| 41 | + Bson group = group("$city", sum("totalPop", "$pop")); |
| 42 | + Bson project = project(fields(excludeId(), include("totalPop"), computed("city", "$_id"))); |
| 43 | + Bson sort = sort(descending("totalPop")); |
| 44 | + |
| 45 | + ArrayList<Document> results = zips.aggregate(Arrays.asList(match, group, project, sort, limit(3))) |
| 46 | + .into(new ArrayList<>()); |
| 47 | + System.out.println("==> 3 most densely populated cities in Texas"); |
| 48 | + results.forEach(printDocuments()); |
| 49 | + } |
| 50 | + |
| 51 | + /** |
| 52 | + * find the 3 most popular tags and their post titles |
| 53 | + * @param posts sample_training.posts collection from the MongoDB Sample Dataset in MongoDB Atlas. |
| 54 | + */ |
| 55 | + private static void threeMostPopularTags(MongoCollection<Document> posts) { |
| 56 | + Bson unwind = unwind("$tags"); |
| 57 | + Bson group = group("$tags", sum("count", 1L), push("titles", "$title")); |
| 58 | + Bson sort = sort(descending("count")); |
| 59 | + Bson project = project(fields(excludeId(), computed("tag", "$_id"), include("count", "titles"))); |
| 60 | + |
| 61 | + ArrayList<Document> results = posts.aggregate(Arrays.asList(unwind, group, sort, limit(3), project)).into(new ArrayList<>()); |
| 62 | + System.out.println("==> 3 most popular tags and their posts titles"); |
| 63 | + results.forEach(printDocuments()); |
| 64 | + } |
| 65 | + |
| 66 | + private static Consumer<Document> printDocuments() { |
| 67 | + return doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build())); |
| 68 | + } |
| 69 | +} |
0 commit comments