← К оглавлению занятия

✅ Решения

📁 Блок: MongoDB / Повторение ⏱️ Время изучения: ~60 мин 🎯 Сложность: Повторение

⚡ Кратко: суть занятия

Summary 16 повторяет создание коллекций, insertMany, удаление и редактирование документов.

Главная практическая тема недели — aggregation pipeline.

Коллекция users используется для вставки 4 документов и обновления возраста через $inc.

Коллекция movies тренирует sort и project: показать title/year и скрыть _id.

Домашнее задание orders повторяет countDocuments, sort, limit, $in и $group.

В $group можно считать сумму покупок по customer через $sum: "$amount".

Для уникальных городов Ольги сначала нужен $match по customer, затем $group по city.

Топ-3 ошибки: путать find().count() и countDocuments(), забывать _id: 0 в project, ставить $group до нужного $match.

Решения с пояснениями

orders

db.orders_name.insertMany([
  { id: 1, customer: "Olga", product: "Apple", amount: 15.55, city: "Berlin" },
  { id: 2, customer: "Anna", product: "Apple", amount: 10.05, city: "Madrid" },
  { id: 3, customer: "Olga", product: "Kiwi", amount: 9.6, city: "Berlin" },
  { id: 4, customer: "Anton", product: "Apple", amount: 20, city: "Roma" },
  { id: 5, customer: "Olga", product: "Banana", amount: 8, city: "Madrid" },
  { id: 6, customer: "Petr", product: "Orange", amount: 18.3, city: "Paris" }
])

Это исходный набор из домашнего задания.

Все покупки

db.orders_name.countDocuments()

Считает все документы.

Покупки Apple

db.orders_name.countDocuments({ product: "Apple" })

Более современная явная форма, чем find(...).count().

Три дорогие покупки

db.orders_name.find({}, { id: 1, _id: 0 }).sort({ amount: -1 }).limit(3)

Сначала сортируем по amount, затем ограничиваем.

Apple в Berlin и Madrid

db.orders_name.countDocuments({
  product: "Apple",
  city: { $in: ["Berlin", "Madrid"] }
})

$in заменяет длинный $or по городам.

Суммы по customer

db.orders_name.aggregate([
  { $group: { _id: "$customer", total: { $sum: "$amount" } } }
])

$sum берёт значение поля amount.

Города Olga

db.orders_name.aggregate([
  { $match: { customer: "Olga" } },
  { $group: { _id: "$city" } }
])

Сначала оставляем покупки Ольги, затем группируем города.