public int returnValueToURL(String URL) { Block<Document> printBlock = new Block<Document>() { @Override public void apply(final Document document) { System.out.println(document.toJson()); } }; MongoCollection<Document> collection = db.getCollection("ratings"); collection.aggregate( Arrays.asList( Aggregates.group("URL", Accumulators.avg("rating", 1)))) .forEach(printBlock); System.out.println(printBlock.toString()); return 0; }
@Test public void ageCounts() { AggregateIterable<Document> documents = userDocuments.aggregate( Arrays.asList( /* * Groups data by the "age" field, and then counts * the number of documents with each given age. * This creates a new "constructed document" that * has "age" as it's "_id", and the count as the * "ageCount" field. */ Aggregates.group("$age", Accumulators.sum("ageCount", 1)), Aggregates.sort(Sorts.ascending("_id")) ) ); List<Document> docs = intoList(documents); assertEquals("Should be two distinct ages", 2, docs.size()); assertEquals(docs.get(0).get("_id"), 25); assertEquals(docs.get(0).get("ageCount"), 1); assertEquals(docs.get(1).get("_id"), 37); assertEquals(docs.get(1).get("ageCount"), 2); }
@Test public void averageAge() { AggregateIterable<Document> documents = userDocuments.aggregate( Arrays.asList( Aggregates.group("$company", Accumulators.avg("averageAge", "$age")), Aggregates.sort(Sorts.ascending("_id")) )); List<Document> docs = intoList(documents); assertEquals("Should be three companies", 3, docs.size()); assertEquals("Frogs, Inc.", docs.get(0).get("_id")); assertEquals(37.0, docs.get(0).get("averageAge")); assertEquals("IBM", docs.get(1).get("_id")); assertEquals(37.0, docs.get(1).get("averageAge")); assertEquals("UMM", docs.get(2).get("_id")); assertEquals(25.0, docs.get(2).get("averageAge")); }
/** * 最大统计 * * @param collectionName * @param match * @param maxField * @return */ public Object max(String collectionName, Document match, String maxField) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , group(null, Accumulators.max("_max", "$" + maxField)) ) ); Document first = aggregate.first(); if (first != null) { return first.get("_max"); } return null; }
/** * 根据统计字段计算统计结果(gte最小值)并排序 * * @param collectionName 集合名 * @param match match条件 * @param field 统计字段 * @param minCount 最小值 * @return */ public LinkedHashMap<String, Integer> sortMap(String collectionName, Document match, String field, int minCount) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , group("$" + field, Accumulators.sum("_count", 1)) , match(new Document("_count", new Document("$gte", minCount))) , sort(new Document("_count", -1)) ) ); LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>(); MongoCursor<Document> iterator = aggregate.iterator(); while (iterator.hasNext()) { Document next = iterator.next(); map.put(next.getString("_id"), next.getInteger("_count")); } return map; }
public String getAverageAgeByCompany() { AggregateIterable<Document> documents = userCollection.aggregate( Arrays.asList( Aggregates.group("$company", Accumulators.avg("averageAge", "$age")), Aggregates.sort(Sorts.ascending("_id")) )); System.err.println(JSON.serialize(documents)); return JSON.serialize(documents); }
/** * 最小统计 * * @param collectionName * @param match * @param minField * @return */ public Object min(String collectionName, Document match, String minField) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , group(null, Accumulators.min("_min", "$" + minField)) ) ); Document first = aggregate.first(); if (first != null) { return first.get("_min"); } return null; }
/** * 合统计 * * @param collectionName * @param match * @param sumField * @return */ public Double sum(String collectionName, Document match, String sumField) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , group(null, Accumulators.sum("_sum", "$" + sumField)) ) ); Document first = aggregate.first(); if (first != null) { return first.getDouble("_sum"); } return null; }
/** * 平均统计 * * @param collectionName * @param match * @param avgField * @return */ public Double avg(String collectionName, Document match, String avgField) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , group(null, Accumulators.avg("_avg", "$" + avgField)) ) ); Document first = aggregate.first(); if (first != null) { return first.getDouble("_avg"); } return null; }
/** * 最近统计 * * @param collectionName * @param match * @param lastField * @param sort * @return */ public Object last(String collectionName, Document match, String lastField, Document sort) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , sort(sort) , group(null, Accumulators.last("_last", "$" + lastField)) ) ); Document first = aggregate.first(); if (first != null) { return first.get("_last"); } return null; }
/** * 标准差统计 * * @param collectionName * @param match * @param stdDevField * @return */ public Double stdDevPop(String collectionName, Document match, String stdDevField) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , group(null, Accumulators.stdDevPop("_stdDev", "$" + stdDevField)) ) ); Document first = aggregate.first(); if (first != null) { return first.getDouble("_stdDev"); } return null; }
/** * 采样标准差统计 * * @param collectionName * @param match * @param stdDevField * @param sampleSize * @return */ public Double stdDevSamp(String collectionName, Document match, String stdDevField, int sampleSize) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) , sample(sampleSize) , group(null, Accumulators.stdDevSamp("_stdDev", "$" + stdDevField)) ) ); Document first = aggregate.first(); if (first != null) { return first.getDouble("_stdDev"); } return null; }
/** * 统计值 是否在统计结果(gte最小值)中 * * @param collectionName 集合名 * @param match match条件 * @param field 统计字段 * @param value 统计值 * @param minCount 最小值 * @return */ public boolean inSortMap(String collectionName, Document match, String field, Object value, int minCount) { AggregateIterable<Document> aggregate = getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match.append(field, value)) , group("$" + field, Accumulators.sum("_count", 1)) , match(new Document("_count", new Document("$gte", minCount))) ) ); Document first = aggregate.first(); return first == null ? false : true; }
@Test public void testAggregate() { List<Document> docList = new ArrayList<Document>(); coll.aggregate(Arrays.asList(Aggregates.match(Filters.eq("name", "Alto")), Aggregates.group("color", Accumulators.sum("count", 1)))).into(docList); assertEquals(1, docList.size()); docList.clear(); Document first = coll .aggregate(Arrays.asList(Aggregates.match(Filters.eq("name", "Alto")), Aggregates.group("color", Accumulators.sum("count", 1))), Document.class) .allowDiskUse(true).batchSize(12).bypassDocumentValidation(true).collation(Collation.builder().build()) .first(); Assert.assertNotNull(first); first = coll .aggregate(Arrays.asList(Aggregates.match(Filters.eq("name", "Alto")), Aggregates.group("color", Accumulators.sum("count", 1))), Document.class) .allowDiskUse(true).batchSize(12).bypassDocumentValidation(true).collation(Collation.builder().build()) .map(new Function<Document, Document>() { @Override public Document apply(Document t) { t.put("hello", "world"); return t; } }).first(); Assert.assertNotNull(first); }
public MongoAccumulator sum(String fieldName, String expression) { accumulators.add(Accumulators.sum(fieldName, expression)); return this; }
public MongoAccumulator avg(String fieldName, String expression) { accumulators.add(Accumulators.avg(fieldName, expression)); return this; }
public MongoAccumulator first(String fieldName, String expression) { accumulators.add(Accumulators.first(fieldName, expression)); return this; }
public MongoAccumulator last(String fieldName, String expression) { accumulators.add(Accumulators.last(fieldName, expression)); return this; }
public MongoAccumulator max(String fieldName, String expression) { accumulators.add(Accumulators.max(fieldName, expression)); return this; }
public MongoAccumulator min(String fieldName, String expression) { accumulators.add(Accumulators.min(fieldName, expression)); return this; }
public MongoAccumulator push(String fieldName, String expression) { accumulators.add(Accumulators.push(fieldName, expression)); return this; }
public MongoAccumulator addToSet(String fieldName, String expression) { accumulators.add(Accumulators.addToSet(fieldName, expression)); return this; }
public MongoAccumulator stdDevPop(String fieldName, String expression) { accumulators.add(Accumulators.stdDevPop(fieldName, expression)); return this; }
public MongoAccumulator stdDevSamp(String fieldName, String expression) { accumulators.add(Accumulators.stdDevSamp(fieldName, expression)); return this; }
@Test public void testFilterParametersBsonDocumentGroup() { Bson group = Aggregates.group("_id", Accumulators.sum("totalQuantity", "$quantity")); BsonDocument filterParameters = MongoUtilities.filterParameters(group); assertEquals("{ \"$group\" : { \"_id\" : \"_id\", \"totalQuantity\" : { \"$sum\" : \"$quantity\" } } }", filterParameters.toString()); }