Фильтрация коллекций MongoDB

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

Введение

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

Применение нескольких условий

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

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

mongosh

Оказавшись внутри оболочки mongosh, вы увидите приглашение >. Давайте переключимся на новую базу данных под названием school_database и создадим коллекцию students с некоторыми примерами данных.

use school_database
db.students.insertMany([
  { name: "Alice", age: 22, grade: "A", major: "Computer Science" },
  { name: "Bob", age: 20, grade: "B", major: "Mathematics" },
  { name: "Charlie", age: 25, grade: "A", major: "Physics" },
  { name: "David", age: 19, grade: "C", major: "Computer Science" }
]);

Эта команда вставляет четыре документа в коллекцию students. Теперь найдем студентов, которые соответствуют нескольким условиям. Мы будем использовать оператор $and для поиска студентов, которым 20 лет или больше И у которых оценка "A".

db.students.find({
  $and: [{ age: { $gte: 20 } }, { grade: "A" }]
});

Этот запрос использует $gte (больше или равно) и $and, чтобы гарантировать выполнение обоих условий. Результат покажет Алису и Чарли:

[
  {
    _id: ObjectId("..."),
    name: 'Alice',
    age: 22,
    grade: 'A',
    major: 'Computer Science'
  },
  {
    _id: ObjectId("..."),
    name: 'Charlie',
    age: 25,
    grade: 'A',
    major: 'Physics'
  }
]

Далее, давайте используем оператор $or для поиска документов, которые соответствуют хотя бы одному из нескольких условий. Этот запрос находит студентов, которые либо изучают "Computer Science", ЛИБО младше 21 года.

db.students.find({
  $or: [{ major: "Computer Science" }, { age: { $lt: 21 } }]
});

Этот запрос использует $lt (меньше). Результат будет включать Алису и Дэвида (специальность "Computer Science") и Боба и Дэвида (младше 21 года). Поскольку Дэвид соответствует обоим условиям, он появляется один раз.

[
  {
    _id: ObjectId("..."),
    name: 'Alice',
    age: 22,
    grade: 'A',
    major: 'Computer Science'
  },
  {
    _id: ObjectId("..."),
    name: 'Bob',
    age: 20,
    grade: 'B',
    major: 'Mathematics'
  },
  {
    _id: ObjectId("..."),
    name: 'David',
    age: 19,
    grade: 'C',
    major: 'Computer Science'
  }
]

На следующем шаге вы изучите другие операторы сравнения. Пока вы можете оставаться в оболочке mongosh.

Использование операторов сравнения

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

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

db.students.drop();
db.students.insertMany([
  {
    name: "Alice",
    age: 22,
    grade: "A",
    major: "Computer Science",
    credits: 45
  },
  { name: "Bob", age: 20, grade: "B", major: "Mathematics", credits: 35 },
  { name: "Charlie", age: 25, grade: "A", major: "Physics", credits: 50 },
  { name: "David", age: 19, grade: "C", major: "Computer Science", credits: 25 }
]);

Теперь давайте используем операторы "больше чем" ($gt) и "меньше чем" ($lt), чтобы найти студентов, которые старше 20 лет, но младше 25 лет.

db.students.find({ age: { $gt: 20, $lt: 25 } });

Этот запрос вернет только документ Алисы, которой 22 года.

Далее, используйте "больше или равно" ($gte) и "меньше или равно" ($lte), чтобы найти студентов с количеством кредитов от 40 до 50 включительно.

db.students.find({ credits: { $gte: 40, $lte: 50 } });

Этот запрос вернет Алису (45 кредитов) и Чарли (50 кредитов).

Наконец, давайте используем оператор "не равно" ($ne), чтобы найти всех студентов, у которых оценка не "C".

db.students.find({ grade: { $ne: "C" } });

Это вернет Алису, Боба и Чарли, исключая Дэвида, у которого оценка "C". Эти операторы являются основополагающими для создания детальных и специфических запросов в MongoDB.

Сопоставление с использованием регулярных выражений

Регулярные выражения (regex) предоставляют гибкий способ выполнения мощного поиска по тексту. На этом шаге вы узнаете, как использовать regex в ваших запросах MongoDB.

Сначала подготовим данные для этого шага. Очистим коллекцию и вставим новые документы с более подробными строковыми полями.

db.students.drop();
db.students.insertMany([
  {
    name: "Alice Johnson",
    age: 22,
    major: "Computer Science",
    email: "alice.j@example.com"
  },
  {
    name: "Bob Smith",
    age: 20,
    major: "Mathematics",
    email: "bob.smith@university.edu"
  },
  {
    name: "Charlie Brown",
    age: 25,
    major: "Physics",
    email: "charlie.brown@school.org"
  },
  {
    name: "David Lee",
    age: 19,
    major: "Computer Engineering",
    email: "david.lee@tech.net"
  }
]);

Чтобы найти всех студентов, чьи имена начинаются с "Alice", вы можете использовать оператор $regex с якорем ^.

db.students.find({ name: { $regex: "^Alice" } });

Этот запрос вернет документ "Alice Johnson". Символ ^ обозначает начало строки.

Чтобы найти студентов с адресом электронной почты из определенного домена, например example.com, используйте якорь $ для сопоставления конца строки.

db.students.find({ email: { $regex: "@example.com$" } });

Это найдет "Alice Johnson", чей адрес электронной почты заканчивается на @example.com.

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

db.students.find({ name: { $regex: "smith", $options: "i" } });

Этот запрос найдет "Bob Smith".

Наконец, чтобы найти любую специальность, содержащую слово "Computer", вы можете использовать простой шаблон regex без каких-либо якорей.

db.students.find({ major: { $regex: "Computer" } });

Это вернет как "Alice Johnson" (Computer Science), так и "David Lee" (Computer Engineering).

Проверка наличия поля

Иногда документы в коллекции имеют разную структуру. Этот шаг научит вас выполнять запросы к документам на основе наличия или отсутствия определенного поля.

Начнем с вставки нового набора документов, в которых отсутствуют некоторые поля.

db.students.drop();
db.students.insertMany([
  { name: "Alice", age: 22, major: "Computer Science", scholarship: 1000 },
  { name: "Bob", age: 20, major: "Mathematics" },
  { name: "Charlie", age: 25, major: "Physics", internship: "Research Lab" },
  { name: "David", age: 19, contact: { phone: "555-1234" } }
]);

Чтобы найти всех студентов, у которых есть поле scholarship, используйте оператор $exists со значением true.

db.students.find({ scholarship: { $exists: true } });

Этот запрос вернет только документ Алисы, так как только у нее есть поле scholarship.

И наоборот, чтобы найти студентов, у которых нет поля internship, установите $exists в false.

db.students.find({ internship: { $exists: false } });

Это вернет документы Алисы, Боба и Дэвида, поскольку ни у одного из них нет поля internship.

Оператор $exists также работает с вложенными полями. Чтобы найти студента, у которого есть объект contact, содержащий поле phone, вы можете использовать точечную нотацию.

db.students.find({ "contact.phone": { $exists: true } });

Этот запрос специально ищет поле phone внутри объекта contact и вернет документ Дэвида.

Поиск нулевых значений

На этом заключительном этапе вы узнаете, как выполнять запросы к документам, содержащим null значения. Значение null представляет собой намеренное отсутствие значения.

Сначала давайте настроим коллекцию с документами, содержащими null значения и отсутствующие поля.

db.students.drop();
db.students.insertMany([
  { name: "Alice", age: 22, email: null },
  { name: "Bob", age: 20, major: "Mathematics" },
  { name: "Charlie", age: null, major: "Physics" },
  { name: "David", contact: { email: null } }
]);

Чтобы найти документы, в которых поле имеет значение null, вы можете выполнить запрос непосредственно к null. Следующий запрос находит все документы, в которых поле email равно null ИЛИ поле email отсутствует.

db.students.find({ email: null });

Этот запрос вернет все четыре документа: Alice (где email явно равно null), Bob (где поле email отсутствует), Charlie (где поле email отсутствует) и David (где поле email отсутствует).

Чтобы найти только те документы, в которых поле явно установлено в null, вам необходимо объединить проверку null с проверкой $exists.

db.students.find({ email: { $type: "null" } });

В качестве альтернативы вы можете использовать оператор $type. Тип BSON для null равен 10. Этот запрос вернет только документ для Alice.

db.students.find({ email: { $type: 10 } });

Вы также можете выполнять запросы к null значениям во вложенных документах. Следующий запрос находит документы, в которых поле email внутри объекта contact равно null ИЛИ где поле contact отсутствует.

db.students.find({ "contact.email": null });

Это вернет все четыре документа: Alice, Bob и Charlie (где поле contact отсутствует) и David (где contact.email явно равно null). Понимание того, как выполнять запросы к null, имеет решающее значение для обработки неполных или разреженных данных.

Когда вы закончите, вы можете выйти из оболочки mongosh, набрав exit или нажав Ctrl+D.

Резюме

В этой лабораторной работе вы изучили несколько основных методов фильтрации коллекций в MongoDB. Вы отработали применение нескольких условий с использованием операторов $and и $or, что позволяет создавать сложные и точные запросы. Вы также ознакомились с рядом операторов сравнения, таких как $gt, $lt и $ne, для уточнения критериев поиска. Кроме того, вы получили опыт сопоставления текста с использованием регулярных выражений, проверки наличия полей с помощью $exists и выполнения запросов к значениям null. Эти навыки закладывают прочную основу для эффективного извлечения и манипулирования данными в MongoDB.