Написание базовых запросов MongoDB

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

Введение

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

Подключение к MongoDB и поиск всех документов

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

Сначала откройте терминал и запустите MongoDB Shell, выполнив команду mongosh.

mongosh

Приглашение вашего терминала изменится, указывая, что вы находитесь в MongoDB Shell и готовы выполнять команды базы данных.

Далее переключитесь на новую базу данных с именем bookstore. Если база данных не существует, MongoDB создаст ее при первом сохранении данных.

use bookstore

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

db.books.insertMany([
  { title: "Python Basics", author: "John Smith", year: 2022, stock: 15 },
  { title: "MongoDB Essentials", author: "Jane Doe", year: 2023, stock: 8 },
  { title: "Web Development", author: "Alice Johnson", year: 2021, stock: 20 }
]);

После выполнения команды вы увидите подтверждение успешной вставки документов.

Чтобы извлечь и просмотреть все документы в коллекции books, используйте метод find() без аргументов.

db.books.find();

В выводе будут перечислены все три документа, которые вы только что вставили. Каждый документ имеет поле _id, которое является уникальным идентификатором, автоматически добавляемым MongoDB.

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  },
  {
    _id: ObjectId("..."),
    title: 'MongoDB Essentials',
    author: 'Jane Doe',
    year: 2023,
    stock: 8
  },
  {
    _id: ObjectId("..."),
    title: 'Web Development',
    author: 'Alice Johnson',
    year: 2021,
    stock: 20
  }
]

Запрос документов с точным совпадением

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

Найдем книгу с точным названием "Python Basics". Фильтр запроса { title: "Python Basics" } указывает MongoDB вернуть только те документы, где поле title точно соответствует "Python Basics".

db.books.find({ title: "Python Basics" });

Команда вернет только один документ, соответствующий критериям:

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  }
]

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

db.books.find({ year: 2021 });

Чтобы создать более специфичный запрос, вы можете указать несколько полей в документе фильтра. Это создает неявное условие "И" (AND), что означает, что все указанные условия должны быть истинными, чтобы документ был возвращен. Найдем книгу, написанную "Jane Doe" И опубликованную в 2023 году.

db.books.find({ author: "Jane Doe", year: 2023 });

Этот запрос вернет книгу "MongoDB Essentials", поскольку это единственная книга, соответствующая как автору, так и году.

Фильтрация с использованием операторов сравнения

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

Операторы сравнения указываются в документе запроса с использованием синтаксиса вида { поле: { $оператор: значение } }.

Найдем все книги, опубликованные после 2021 года. Мы будем использовать оператор "больше чем", $gt.

db.books.find({ year: { $gt: 2021 } });

Это вернет "Python Basics" (2022) и "MongoDB Essentials" (2023).

Вот некоторые другие распространенные операторы сравнения:

  • $lt: меньше чем
  • $gte: больше или равно
  • $lte: меньше или равно
  • $ne: не равно

Например, чтобы найти все книги с запасом 15 или меньше, вы можете использовать оператор $lte.

db.books.find({ stock: { $lte: 15 } });

Еще один полезный оператор — $in, который соответствует любому из значений, указанных в массиве. Найдем все книги, написанные либо "John Smith", либо "Alice Johnson".

db.books.find({ author: { $in: ["John Smith", "Alice Johnson"] } });

Этот запрос вернет "Python Basics" и "Web Development". Вы можете комбинировать операторы с точными совпадениями для построения более сложных запросов. Например, найдите книги, опубликованные в 2022 году или позже, с запасом менее 20.

db.books.find({ year: { $gte: 2022 }, stock: { $lt: 20 } });

Выбор конкретных полей для возврата (Проекция)

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

Проекция обрабатывается вторым аргументом метода find(). Этот аргумент представляет собой документ, в котором вы указываете поля для включения со значением 1 или для исключения со значением 0.

Извлечем все книги, но вернем только их поля title и author. Первый аргумент, {}, является пустым фильтром, который соответствует всем документам.

db.books.find({}, { title: 1, author: 1 });

Вы заметите, что поле _id по-прежнему включено в вывод. Поле _id всегда возвращается по умолчанию. Чтобы исключить его, вы должны явно установить его значение в 0.

db.books.find({}, { title: 1, author: 1, _id: 0 });

Теперь вывод будет намного чище и будет содержать только запрошенные поля:

[
  { "title": "Python Basics", "author": "John Smith" },
  { "title": "MongoDB Essentials", "author": "Jane Doe" },
  { "title": "Web Development", "author": "Alice Johnson" }
]

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

db.books.find({ year: 2023 }, { title: 1, _id: 0 });

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

Сортировка, пропуск и ограничение результатов

Часто требуется контролировать порядок и количество результатов, возвращаемых запросом. MongoDB предоставляет методы курсора, которые можно последовательно применять к запросу find() для сортировки, пропуска и ограничения документов в наборе результатов.

Для сортировки результатов используйте метод .sort(). Он принимает документ, указывающий поле для сортировки и направление: 1 для сортировки по возрастанию и -1 для сортировки по убыванию. Отсортируем книги по году в порядке убывания (сначала самые новые).

db.books.find().sort({ year: -1 });

Чтобы ограничить количество возвращаемых документов, используйте метод .limit(). Например, чтобы получить только 2 самые новые книги:

db.books.find().sort({ year: -1 }).limit(2);

Метод .skip() используется для пропуска указанного количества документов с начала набора результатов. Это полезно для реализации постраничного вывода. Получим все книги, но пропустим первый результат.

db.books.find().sort({ year: 1 }).skip(1);

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

db.books.find().sort({ year: 1 }).skip(1).limit(1);

Эта команда вернет книгу "Python Basics", опубликованную в 2022 году.

Наконец, чтобы выйти из оболочки MongoDB, введите exit или нажмите Ctrl+D.

exit;

Резюме

В этой лабораторной работе вы изучили основы написания базовых запросов в MongoDB. Вы начали с подключения к базе данных с помощью оболочки mongosh и вставки документов в коллекцию. Затем вы практиковались в извлечении документов с помощью find(), фильтрации результатов по точному совпадению и операторам сравнения, таким как $gt и $in, а также использовали проекцию для выбора конкретных полей. Наконец, вы узнали, как форматировать вывод, последовательно применяя методы курсора, такие как .sort(), .limit() и .skip(), для управления порядком и размером набора результатов. Эти навыки составляют основу для взаимодействия с данными и управления ими в MongoDB.