Группировка данных MongoDB

MongoDBMongoDBBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии вы научитесь выполнять базовые операции агрегации в MongoDB, включая группировку данных по одному полю, вычисление сумм групп, подсчет элементов в группах, фильтрацию групп и сортировку результатов групп. Эти навыки необходимы для анализа данных и получения полезных выводов из данных MongoDB.

В практическом занятии рассматриваются различные методы агрегации, начиная от группировки данных по одному полю и до более сложных операций, таких как вычисление средних значений, подсчет количества и фильтрация групп. В конце практического занятия вы будете хорошо разбираться, как использовать агрегирующий фреймворк MongoDB для раскрытия потенциала ваших данных.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/QueryOperationsGroup -.-> mongodb/sort_documents("Sort Documents") mongodb/QueryOperationsGroup -.-> mongodb/project_fields("Project Fields") mongodb/AggregationOperationsGroup -.-> mongodb/group_documents("Group Documents") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/insert_document -.-> lab-422083{{"Группировка данных MongoDB"}} mongodb/query_with_conditions -.-> lab-422083{{"Группировка данных MongoDB"}} mongodb/sort_documents -.-> lab-422083{{"Группировка данных MongoDB"}} mongodb/project_fields -.-> lab-422083{{"Группировка данных MongoDB"}} mongodb/group_documents -.-> lab-422083{{"Группировка данных MongoDB"}} mongodb/aggregate_group_totals -.-> lab-422083{{"Группировка данных MongoDB"}} end

Группировка по одному полю

В этом шаге вы научитесь группировать данные по одному полю с использованием агрегирующего фреймворка MongoDB. Группировка позволяет организовывать и суммировать данные на основе определенного поля, что является важным аспектом анализа данных.

Сначала запустим MongoDB shell:

mongosh

Теперь создадим примерную коллекцию продуктов для демонстрации группировки:

use salesdb

db.products.insertMany([
    { category: "Electronics", price: 500 },
    { category: "Clothing", price: 50 },
    { category: "Electronics", price: 300 },
    { category: "Books", price: 25 },
    { category: "Clothing", price: 75 },
    { category: "Books", price: 40 }
])

Далее мы используем оператор агрегации $group для группировки продуктов по их категории и вычисления общей стоимости для каждой категории:

db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalPrice: { $sum: "$price" }
    }
  }
]);
Пример вывода
[
  { _id: 'Electronics', totalPrice: 800 },
  { _id: 'Clothing', totalPrice: 125 },
  { _id: 'Books', totalPrice: 65 }
]

Разберём агрегирующий пайплайн:

  • $group: Группирует документы по заданному выражению
  • _id: "$category": Указывает, что мы группируем по полю category
  • totalPrice: { $sum: "$price" }: Вычисляет общую стоимость для каждой категории

Вычисление сумм групп

В этом шаге мы расширим навыки группировки, научившись вычислять различные агрегированные суммы с использованием агрегирующего фреймворка MongoDB. Мы будем использовать несколько операторов агрегации, чтобы получить более сложные выводы из наших данных о продуктах.

Продолжим работать с базой данных salesdb и коллекцией products, созданными на предыдущем шаге:

// Ensure we're in the correct database
use salesdb

Мы рассмотрим различные операторы агрегации для вычисления сумм групп:

  1. Вычисление средней цены для каждой категории:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      averagePrice: { $avg: "$price" }
    }
  }
]);
  1. Поиск максимальной и минимальной цен в каждой категории:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      maxPrice: { $max: "$price" },
      minPrice: { $min: "$price" }
    }
  }
]);
  1. Объединение нескольких вычислений в одной агрегации:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalPrice: { $sum: "$price" },
      averagePrice: { $avg: "$price" },
      productCount: { $sum: 1 }
    }
  }
]);
Пример вывода
[
  {
    _id: 'Electronics',
    totalPrice: 800,
    averagePrice: 400,
    productCount: 2
  },
  {
    _id: 'Clothing',
    totalPrice: 125,
    averagePrice: 62.5,
    productCount: 2
  },
  {
    _id: 'Books',
    totalPrice: 65,
    averagePrice: 32.5,
    productCount: 2
  }
]

Пояснение основных операторов агрегации:

  • $avg: Вычисляет среднее значение числовых значений
  • $max: Находит максимальное значение
  • $min: Находит минимальное значение
  • $sum: 1: Считает количество документов в каждой группе

Подсчет элементов в группах

В этом шаге мы исследуем различные способы подсчета элементов внутри групп с использованием агрегирующего фреймворка MongoDB. Подсчет является фундаментальной операцией, которая помогает понять распределение ваших данных.

Продолжим работать с нашей базой данных salesdb:

// Ensure we're in the correct database
use salesdb

Сначала добавим больше продуктов, чтобы сделать наш подсчет более интересным:

db.products.insertMany([
  { category: "Electronics", brand: "Apple" },
  { category: "Electronics", brand: "Samsung" },
  { category: "Clothing", brand: "Nike" },
  { category: "Clothing", brand: "Adidas" },
  { category: "Books", brand: "Penguin" },
  { category: "Books", brand: "Oxford" }
]);

Теперь подсчитаем элементы различными способами:

  1. Подсчитайте количество продуктов в каждой категории:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      productCount: { $sum: 1 }
    }
  }
]);
  1. Подсчитайте уникальные бренды внутри каждой категории:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      uniqueBrands: { $addToSet: "$brand" }
    }
  }
]);
  1. Подсчитайте количество уникальных брендов и общее количество продуктов:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalProducts: { $sum: 1 },
      uniqueBrands: { $addToSet: "$brand" },
      brandCount: { $addToSet: "$brand" }
    }
  },
  {
    $project: {
      totalProducts: 1,
      uniqueBrandCount: { $size: "$uniqueBrands" }
    }
  }
]);
Пример вывода
[
  {
    _id: 'Electronics',
    totalProducts: 4,
    uniqueBrandCount: 2
  },
  {
    _id: 'Clothing',
    totalProducts: 4,
    uniqueBrandCount: 2
  },
  {
    _id: 'Books',
    totalProducts: 4,
    uniqueBrandCount: 2
  }
]

Пояснение основных операторов агрегации:

  • $sum: 1: Считает общее количество документов в каждой группе
  • $addToSet: Создает массив уникальных значений
  • $size: Считает количество элементов в массиве

Фильтрация групп

В этом шаге мы научимся фильтровать группы с использованием агрегирующего фреймворка MongoDB. Фильтрация позволяет сосредоточиться на конкретных подмножествах ваших сгруппированных данных, обеспечивая более нацеленные выводы.

Продолжим работать с нашей базой данных salesdb:

// Ensure we're in the correct database
use salesdb

Добавим некоторую информацию о цене к нашим существующим продуктам, чтобы сделать фильтрацию более осмысленной:

db.products.updateMany(
  { category: "Electronics", brand: "Apple" },
  { $set: { price: 1000 } }
);

db.products.updateMany(
  { category: "Electronics", brand: "Samsung" },
  { $set: { price: 800 } }
);

db.products.updateMany(
  { category: "Clothing", brand: "Nike" },
  { $set: { price: 100 } }
);

db.products.updateMany(
  { category: "Clothing", brand: "Adidas" },
  { $set: { price: 80 } }
);

Теперь исследуем различные методы фильтрации:

  1. Фильтрация групп с более чем одним продуктом:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      products: { $push: "$brand" },
      productCount: { $sum: 1 }
    }
  },
  {
    $match: {
      productCount: { $gt: 1 }
    }
  }
]);
  1. Фильтрация групп с общей ценой выше определенного порога:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalPrice: { $sum: "$price" },
      products: { $push: "$brand" }
    }
  },
  {
    $match: {
      totalPrice: { $gt: 500 }
    }
  }
]);
  1. Сложная фильтрация с несколькими условиями:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalPrice: { $sum: "$price" },
      avgPrice: { $avg: "$price" },
      brands: { $addToSet: "$brand" }
    }
  },
  {
    $match: {
      totalPrice: { $gt: 500 },
      avgPrice: { $lt: 900 }
    }
  }
]);
Пример вывода
[
  {
    _id: 'Electronics',
    totalPrice: 1800,
    avgPrice: 900,
    brands: [ 'Apple', 'Samsung' ]
  }
]

Пояснение основных операторов агрегации:

  • $match: Фильтрует документы на основе заданных условий
  • $gt: Больше чем
  • $lt: Меньше чем
  • $push: Добавляет элементы в массив
  • $addToSet: Добавляет уникальные элементы в массив

Сортировка результатов группировки

В этом последнем шаге мы научимся сортировать сгруппированные результаты с использованием агрегирующего фреймворка MongoDB. Сортировка помогает организовать и приоритетно расположить ваши агрегированные данные, делая их анализ и понимание проще.

Продолжим работать с нашей базой данных salesdb:

// Ensure we're in the correct database
use salesdb

Мы будем использовать продукты, которые уже создали, для демонстрации техник сортировки:

  1. Сортировать группы по общей цене в порядке убывания:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalPrice: { $sum: "$price" },
      productCount: { $sum: 1 }
    }
  },
  {
    $sort: {
      totalPrice: -1
    }
  }
]);
  1. Сортировать группы по количеству продуктов и общей цене:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalPrice: { $sum: "$price" },
      productCount: { $sum: 1 }
    }
  },
  {
    $sort: {
      productCount: -1,
      totalPrice: 1
    }
  }
]);
  1. Расширенная сортировка с несколькими стадиями агрегации:
db.products.aggregate([
  {
    $group: {
      _id: "$category",
      totalPrice: { $sum: "$price" },
      avgPrice: { $avg: "$price" },
      brands: { $addToSet: "$brand" }
    }
  },
  {
    $project: {
      category: "$_id",
      totalPrice: 1,
      avgPrice: 1,
      brandCount: { $size: "$brands" }
    }
  },
  {
    $sort: {
      brandCount: -1,
      totalPrice: -1
    }
  }
]);
Пример вывода
[
  {
    category: 'Electronics',
    totalPrice: 1800,
    avgPrice: 900,
    brandCount: 2
  },
  {
    category: 'Clothing',
    totalPrice: 180,
    avgPrice: 90,
    brandCount: 2
  },
  {
    category: 'Books',
    totalPrice: 0,
    avgPrice: 0,
    brandCount: 2
  }
]

Пояснение основных операторов агрегации:

  • $sort: Сортирует документы
    • 1: В порядке возрастания
    • -1: В порядке убывания
  • $project: Преобразует документы, позволяя включать, исключать или трансформировать поля
  • $size: Считает количество элементов в массиве

Резюме

В этом практическом занятии вы научитесь группировать данные MongoDB с использованием агрегирующего фреймворка. Сначала вы будете группировать данные по одному полю, такому как категория продукта, и вычислять общую стоимость для каждой группы. Затем вы изучите более продвинутые операторы агрегации для вычисления сумм групп, включая среднюю цену, количество элементов, а также фильтрацию и сортировку сгруппированных результатов. Эти методы являются важными для анализа данных и получения полезных выводов из ваших данных MongoDB.