Преобразование данных MongoDB

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

Введение

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

Настройка и базовый выбор полей

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

Сначала откройте терминал и запустите MongoDB Shell (mongosh). Эта интерактивная оболочка является основным способом взаимодействия с вашим экземпляром MongoDB. Вы будете выполнять все операции с базой данных в этой оболочке на протяжении всей лабораторной работы.

mongosh

Как только вы окажетесь внутри MongoDB Shell, ваш приглашение изменится. Теперь создайте и переключитесь на новую базу данных с именем bookstore. Если база данных не существует, эта команда создаст ее.

use bookstore

Далее создайте коллекцию с именем books и вставьте в нее три образца документов с помощью команды insertMany. Коллекция — это группа документов, аналогичная таблице в базе данных SQL.

db.books.insertMany([
  {
    title: "MongoDB Basics",
    author: "Jane Smith",
    price: 29.99,
    pages: 250,
    categories: ["Database", "Programming"]
  },
  {
    title: "Python Deep Dive",
    author: "John Doe",
    price: 39.99,
    pages: 450,
    categories: ["Programming", "Python"]
  },
  {
    title: "Data Science Handbook",
    author: "Alice Johnson",
    price: 49.99,
    pages: 600,
    categories: ["Data Science", "Programming"]
  }
]);

Теперь, когда у вас есть данные, давайте используем конвейер агрегации для их трансформации. Метод aggregate принимает массив этапов (stages), где каждый этап выполняет операцию над данными. Нашим первым этапом будет $project, который изменяет структуру документов.

Выполните следующую команду, чтобы выбрать только поля title и author, переименовав их соответственно в bookTitle и bookAuthor.

db.books.aggregate([
  {
    $project: {
      _id: 0,
      bookTitle: "$title",
      bookAuthor: "$author"
    }
  }
]);

Вы должны увидеть следующий вывод:

[
  { "bookTitle": "MongoDB Basics", "bookAuthor": "Jane Smith" },
  { "bookTitle": "Python Deep Dive", "bookAuthor": "John Doe" },
  { "bookTitle": "Data Science Handbook", "bookAuthor": "Alice Johnson" }
]

Разберем этап $project:

  • _id: 0 исключает поле _id по умолчанию из вывода. По умолчанию оно всегда включается.
  • bookTitle: "$title" создает новое поле с именем bookTitle и присваивает ему значение исходного поля title. Префикс $ указывает, что вы ссылаетесь на значение поля.
  • bookAuthor: "$author" аналогично переименовывает поле author в bookAuthor.

Расчет новых полей

На предыдущем шаге вы выбрали и переименовали существующие поля. Теперь вы научитесь создавать совершенно новые поля, выполняя вычисления над существующими данными. Для этого вы будете использовать этап $addFields, который добавляет новые поля в документы, не удаляя исходные.

Давайте добавим новое поле с именем priceWithTax, которое рассчитывает цену книги с учетом 10% налога.

db.books.aggregate([
  {
    $addFields: {
      priceWithTax: { $multiply: ["$price", 1.1] }
    }
  }
]);

Вывод будет включать все исходные поля плюс новое поле priceWithTax для каждого документа:

[
  {
    _id: ObjectId("..."),
    title: 'MongoDB Basics',
    author: 'Jane Smith',
    price: 29.99,
    pages: 250,
    categories: [ 'Database', 'Programming' ],
    priceWithTax: 32.989
  },
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'John Doe',
    price: 39.99,
    pages: 450,
    categories: [ 'Programming', 'Python' ],
    priceWithTax: 43.989
  },
  {
    _id: ObjectId("..."),
    title: 'Data Science Handbook',
    author: 'Alice Johnson',
    price: 49.99,
    pages: 600,
    categories: [ 'Data Science', 'Programming' ],
    priceWithTax: 54.989
  }
]

В этом конвейере:

  • $addFields — это этап, используемый для добавления новых полей.
  • priceWithTax — это имя нового поля, которое вы создаете.
  • $multiply — это оператор агрегации, который принимает массив из двух чисел и перемножает их. Здесь он умножает значение поля price на 1.1.

Форматирование выходных данных

Данные часто становятся более полезными при правильном форматировании. На этом шаге вы научитесь форматировать строковые и числовые данные, используя различные операторы агрегации в рамках этапа $project. Это полезно для подготовки данных к отображению в приложениях или отчетах.

Давайте создадим более читаемый вывод, преобразовав название книги в верхний регистр и отформатировав цену как строку валюты.

db.books.aggregate([
  {
    $project: {
      _id: 0,
      titleUpperCase: { $toUpper: "$title" },
      formattedPrice: {
        $concat: [{ $literal: "$" }, { $toString: "$price" }]
      }
    }
  }
]);

Ожидаемый вывод покажет преобразованные данные:

[
  {
    "titleUpperCase": "MONGODB BASICS",
    "formattedPrice": "$29.99"
  },
  {
    "titleUpperCase": "PYTHON DEEP DIVE",
    "formattedPrice": "$39.99"
  },
  {
    "titleUpperCase": "DATA SCIENCE HANDBOOK",
    "formattedPrice": "$49.99"
  }
]

Рассмотрим операторы, используемые в этом этапе $project:

  • $toUpper: Этот оператор преобразует строку в верхний регистр. Мы применили его к полю title.
  • $concat: Этот оператор объединяет массив строк. Мы использовали его для добавления префикса знака доллара $ к цене.
  • $literal: Этот оператор используется для представления литеральных значений, которые в противном случае были бы интерпретированы как выражения. Здесь мы используем { $literal: "$" } для представления литерального символа доллара.
  • $toString: Поскольку $concat работает только со строками, нам пришлось сначала преобразовать числовое поле price в строку с помощью оператора $toString.

Фильтрация результатов с помощью $match

Последняя фундаментальная техника, которую вы изучите, — это фильтрация. Этап $match позволяет выбирать только те документы, которые соответствуют определенным критериям, подобно предложению WHERE в SQL. Это один из наиболее распространенных этапов в конвейере агрегации.

Найдем все книги, стоимость которых превышает 35.

db.books.aggregate([
  {
    $match: {
      price: { $gt: 35 }
    }
  }
]);

Вывод будет содержать только две книги, соответствующие фильтру:

[
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'John Doe',
    price: 39.99,
    pages: 450,
    categories: [ 'Programming', 'Python' ]
  },
  {
    _id: ObjectId("..."),
    title: 'Data Science Handbook',
    author: 'Alice Johnson',
    price: 49.99,
    pages: 600,
    categories: [ 'Data Science', 'Programming' ]
  }
]

Этап $match использует стандартный синтаксис запросов MongoDB.

  • price: { $gt: 35 } определяет условие фильтрации. Он выбирает документы, в которых поле price больше ($gt) 35.

Вы также можете объединять этапы для создания более сложных конвейеров. Например, вы можете сначала отфильтровать документы, а затем спроецировать пользовательский вывод из результатов.

db.books.aggregate([
  {
    $match: {
      price: { $gt: 35 }
    }
  },
  {
    $project: {
      _id: 0,
      title: 1,
      price: 1
    }
  }
]);

Этот конвейер сначала фильтрует дорогие книги с помощью $match, а затем для этих результатов использует $project для отображения только title и price. Синтаксис title: 1 в $project является сокращенным способом включения поля.

Окончательный вывод является одновременно отфильтрованным и спроецированным:

[
  { "title": "Python Deep Dive", "price": 39.99 },
  { "title": "Data Science Handbook", "price": 49.99 }
]

Чтобы выйти из оболочки MongoDB, вы можете ввести exit или нажать Ctrl+D.

Резюме

В этой лабораторной работе вы изучили основные операции конвейера агрегации MongoDB. Вы начали с вставки данных, а затем использовали ряд этапов для их преобразования. Вы практиковались в выборе и переименовании полей с помощью $project, создании новых вычисляемых полей с помощью $addFields, изменении внешнего вида данных с помощью операторов форматирования, таких как $toUpper и $concat, и фильтрации документов с помощью $match. Объединяя эти этапы, вы можете создавать сложные конвейеры обработки данных для анализа и изменения формы ваших данных непосредственно в базе данных, что является мощным и эффективным подходом к манипулированию данными.