Aggregate
Import restaurants collection
wget https://www.dropbox.com/s/iovpcb7hc3gc4n4/primer-dataset.json
mongoimport --uri "mongodb+srv://admatic:admatic123@admatic-cluster-7qyyr.mongodb.net/admatic-db" \
--collection restaurants --drop --file primer-dataset.json
2019-02-25T17:56:09.864+0000 connected to: localhost
2019-02-25T17:56:09.979+0000 dropping: admatic-db.restaurants
2019-02-25T17:56:12.489+0000 [
2019-02-25T17:56:12.573+0000 [
2019-02-25T17:56:12.574+0000 imported 25359 documents
Code
mkdir -p src/main/java/com/admatic/primer
vim src/main/java/com/admatic/primer/AggregatePrimer.java
package com.admatic.primer;
import com.mongodb.Block;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.util.logging.Level;
import java.util.logging.Logger;
import static java.util.Arrays.asList;
public class AggregatePrimer {
private static void groupDocumentsByAFieldAndCalculateCount(MongoDatabase db) {
AggregateIterable<Document> iterable = db.getCollection("restaurants").aggregate(asList(
new Document("$group", new Document("_id", "$borough").append("count", new Document("$sum", 1)))));
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
});
}
private static void filterAndGroupDocuments(MongoDatabase db) {
AggregateIterable<Document> iterable = db.getCollection("restaurants").aggregate(asList(
new Document("$match", new Document("borough", "Queens").append("cuisine", "Brazilian")),
new Document("$group", new Document("_id", "$address.zipcode").append("count", new Document("$sum", 1)))));
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
});
}
public static void main(final String[] args) {
Logger mongoLogger = Logger.getLogger("org.mongodb.driver");
mongoLogger.setLevel(Level.SEVERE);
MongoClient mongoClient;
if (args.length == 0) {
mongoClient = MongoClients.create();
} else {
mongoClient = MongoClients.create(args[0]);
}
MongoDatabase database = mongoClient.getDatabase("admatic-db");
switch (args[1]) {
case "0":
System.out.println("groupDocumentsByAFieldAndCalculateCount");
groupDocumentsByAFieldAndCalculateCount(database);
break;
case "1":
System.out.println("filterAndGroupDocuments");
filterAndGroupDocuments(database);
break;
default:
System.out.println("Enter an option between 0 and 1");
}
mongoClient.close();
}
}
Compile
mvn compile
Run
Group Documents By A Field And Calculate Count
db.getCollection("restaurants").aggregate(asList(
new Document("$group", new Document("_id", "$borough").append("count", new Document("$sum", 1))))
mvn exec:java -Dexec.mainClass=com.admatic.primer.AggregatePrimer \
-Dexec.args="mongodb+srv://admatic:admatic123@admatic-cluster-7qyyr.mongodb.net/test 0"
groupDocumentsByAFieldAndCalculateCount
{"_id": "Missing", "count": 51}
{"_id": "Manhattan", "count": 10259}
{"_id": "Staten Island", "count": 969}
{"_id": "Bronx", "count": 2338}
{"_id": "Queens", "count": 5656}
{"_id": "Brooklyn", "count": 6086}
Filter And Group Documents
db.getCollection("restaurants").aggregate(asList(
new Document("$match", new Document("borough", "Queens").append("cuisine", "Brazilian")),
new Document("$group", new Document("_id", "$address.zipcode").append("count", new Document("$sum", 1))))
mvn exec:java -Dexec.mainClass=com.admatic.primer.AggregatePrimer \
-Dexec.args="mongodb+srv://admatic:admatic123@admatic-cluster-7qyyr.mongodb.net/test 1"
filterAndGroupDocuments
{"_id": "11377", "count": 1}
{"_id": "11103", "count": 1}
{"_id": "11106", "count": 3}
{"_id": "11368", "count": 1}
{"_id": "11101", "count": 2}