Skip to main content
QueryBuilder provides built-in aggregation methods for counting, summing, averaging, and grouping data.

Basic Aggregations

Count Records

const activeUsers = await client.queryBuilder()
  .collection('users')
  .whereField('active').equals(true)
  .count();
// Returns: number

Sum a Numeric Field

const totalRevenue = await client.queryBuilder()
  .collection('orders')
  .whereField('status').equals('completed')
  .sumBy('amount');
// Returns: number

Calculate Average

const avgPrice = await client.queryBuilder()
  .collection('products')
  .whereField('category').equals('electronics')
  .avgBy('price');
// Returns: number

Find Maximum Value

const highestPrice = await client.queryBuilder()
  .collection('products')
  .maxBy('price');
// Returns: T | null

Find Minimum Value

const lowestPrice = await client.queryBuilder()
  .collection('products')
  .minBy('price');
// Returns: T | null

Get Distinct Values

const categories = await client.queryBuilder()
  .collection('products')
  .distinctBy('category');
// Returns: string[]

Count Distinct Values

const uniqueCategories = await client.queryBuilder()
  .collection('products')
  .countDistinct('category');
// Returns: number

Grouped Aggregations

Use groupBy() to perform aggregations on groups of records.

Count by Group

// Count users by country
const usersByCountry = await client.queryBuilder()
  .collection('users')
  .groupBy('country')
  .count();
// Returns: { "USA": 150, "UK": 75, "Germany": 50 }

Sum by Group

// Sum order amounts by category
const salesByCategory = await client.queryBuilder()
  .collection('orders')
  .whereField('status').equals('completed')
  .groupBy('category')
  .sumBy('amount');
// Returns: { "electronics": 50000, "clothing": 25000 }

Average by Group

// Average rating by product
const avgRatingByProduct = await client.queryBuilder()
  .collection('reviews')
  .groupBy('productId')
  .avgBy('rating');
// Returns: { "prod_1": 4.5, "prod_2": 3.8 }

Max/Min by Group

const maxPriceByCategory = await client.queryBuilder()
  .collection('products')
  .groupBy('category')
  .maxBy('price');
// Returns: { "electronics": 999, "books": 49 }

Nested Field Grouping

GroupBy supports nested field paths:
// Group by nested field
const ordersByRegion = await client.queryBuilder()
  .collection('orders')
  .groupBy('customer.address.region')
  .sumBy('total');
// Returns: { "West": 10000, "East": 8500 }

Combining Aggregations with Filters

// Sum revenue for completed orders in Q4 2024
const q4Revenue = await client.queryBuilder()
  .collection('orders')
  .whereField('status').equals('completed')
  .whereField('createdAt').dateBetween('2024-10-01', '2024-12-31')
  .sumBy('amount');

// Average rating for verified reviews only
const verifiedAvg = await client.queryBuilder()
  .collection('reviews')
  .whereField('verified').isTrue()
  .avgBy('rating');

Aggregation Operators Reference

MethodDescriptionReturn Type
count()Count matching recordsnumber
sumBy(field)Sum values of a fieldnumber
avgBy(field)Average values of a fieldnumber
minBy(field)Find minimum valueT | null
maxBy(field)Find maximum valueT | null
distinctBy(field)Get unique valuesstring[]
countDistinct(field)Count unique valuesnumber

Analytics Dashboard Example

// Dashboard metrics for an e-commerce app
async function getDashboardMetrics() {
  const [
    totalOrders,
    totalRevenue,
    avgOrderValue,
    ordersByStatus,
    revenueByCategory
  ] = await Promise.all([
    client.queryBuilder()
      .collection('orders')
      .count(),

    client.queryBuilder()
      .collection('orders')
      .whereField('status').equals('completed')
      .sumBy('total'),

    client.queryBuilder()
      .collection('orders')
      .whereField('status').equals('completed')
      .avgBy('total'),

    client.queryBuilder()
      .collection('orders')
      .groupBy('status')
      .count(),

    client.queryBuilder()
      .collection('orders')
      .whereField('status').equals('completed')
      .groupBy('category')
      .sumBy('total')
  ]);

  return {
    totalOrders,
    totalRevenue,
    avgOrderValue,
    ordersByStatus,
    revenueByCategory
  };
}

Next Steps