Запросы к массивам в MongoDB

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

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

Введение

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/DataTypesGroup -.-> mongodb/work_with_array_data_types("Work with Array Data Types") mongodb/DataTypesGroup -.-> mongodb/manage_array_elements("Manage Array Elements") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") subgraph Lab Skills mongodb/find_documents -.-> lab-422090{{"Запросы к массивам в MongoDB"}} mongodb/work_with_array_data_types -.-> lab-422090{{"Запросы к массивам в MongoDB"}} mongodb/manage_array_elements -.-> lab-422090{{"Запросы к массивам в MongoDB"}} mongodb/query_embedded_documents -.-> lab-422090{{"Запросы к массивам в MongoDB"}} end

Поиск элементов в массиве

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

Сначала запустим MongoDB shell и создадим образцовую коллекцию с данными в массивах:

mongosh

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

use arraylab

db.products.insertMany([
    {
        name: "Ноутбук",
        tags: ["электроника", "компьютер", "работа"],
        colors: ["серебристый", "черный", "синий"]
    },
    {
        name: "Смартфон",
        tags: ["электроника", "мобильный", "коммуникация"],
        colors: ["красный", "синий", "зеленый"]
    },
    {
        name: "Наушники",
        tags: ["электроника", "аудио", "музыка"],
        colors: ["черный", "белый"]
    }
])

Поищем документы, которые содержат определенный элемент в массиве:

db.products.find({ tags: "электроника" });

Этот запрос вернет все документы, в которых в массиве tags присутствует "электроника".

Пример вывода:

[
  {
    _id: ObjectId("..."),
    name: 'Ноутбук',
    tags: [ 'электроника', 'компьютер', 'работа' ],
    colors: [ 'серебристый', 'черный', 'синий' ]
  },
  {
    _id: ObjectId("..."),
    name: 'Смартфон',
    tags: [ 'электроника', 'мобильный', 'коммуникация' ],
    colors: [ 'красный', 'синий', 'зеленый' ]
  },
  {
    _id: ObjectId("..."),
    name: 'Наушники',
    tags: [ 'электроника', 'аудио', 'музыка' ],
    colors: [ 'черный', 'белый' ]
  }
]

Вы также можете искать документы, в которых массив содержит несколько определенных элементов:

db.products.find({ colors: { $all: ["черный", "синий"] } });

Этот запрос находит продукты, у которых в массиве colors есть и "черный", и "синий".

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

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

Мы продолжим использовать базу данных и коллекцию из предыдущего шага. Если вы закрыли MongoDB shell, запустите его снова и выберите базу данных:

mongosh
use arraylab

Давайте сначала узнаем о операторе $elemMatch, который позволяет сопоставлять документы, в которых хотя бы один элемент массива соответствует нескольким условиям:

db.products.insertMany([
  {
    name: "Игровой ноутбук",
    specs: [
      { ram: 16, storage: 512, price: 1200 },
      { ram: 32, storage: 1024, price: 2000 }
    ]
  },
  {
    name: "Офисный ноутбук",
    specs: [
      { ram: 8, storage: 256, price: 600 },
      { ram: 16, storage: 512, price: 800 }
    ]
  }
]);

// Найти ноутбуки с характеристиками, где RAM >= 16 и цена > 1000
db.products.find({
  specs: {
    $elemMatch: {
      ram: { $gte: 16 },
      price: { $gt: 1000 }
    }
  }
});

Далее, давайте изучим оператор $size, чтобы найти документы с массивами определенной длины:

// Найти продукты с ровно 2 цветами
db.products.find({ colors: { $size: 2 } });

Мы также покажем оператор $slice, чтобы получить подмножество элементов массива:

// Получить только первые два тега из каждого продукта
db.products.find({}, { tags: { $slice: 2 } });

Пример вывода:

[
  {
    _id: ObjectId("..."),
    name: 'Ноутбук',
    tags: [ 'электроника', 'компьютер' ]
  },
  {
    _id: ObjectId("..."),
    name: 'Смартфон',
    tags: [ 'электроника', 'мобильный' ]
  }
]

Поиск по размеру массива

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

Сначала запустим MongoDB shell и убедимся, что используем нашу предыдущую базу данных:

mongosh
use arraylab

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

db.products.insertMany([
  {
    name: "Базовый ноутбук",
    features: ["wifi"],
    accessories: ["зарядка"]
  },
  {
    name: "Продвинутый ноутбук",
    features: ["wifi", "bluetooth", "touchscreen"],
    accessories: ["зарядка", "мышь", " футляр"]
  },
  {
    name: "Премиум ноутбук",
    features: ["wifi", "bluetooth", "touchscreen", "4K дисплей"],
    accessories: ["зарядка", "мышь", " футляр", "клавиатура"]
  }
]);

Теперь запросим документы с массивами определенных размеров:

// Найти продукты с ровно 1 функцией
db.products.find({ features: { $size: 1 } });

// Найти продукты с 3 функциями
db.products.find({ features: { $size: 3 } });

// Найти продукты с 4 аксессуарами
db.products.find({ accessories: { $size: 4 } });

Пример вывода:

// Продукты с 1 функцией
[
  {
    _id: ObjectId("..."),
    name: "Базовый ноутбук",
    features: [ "wifi" ],
    accessories: [ "зарядка" ]
  }
]

// Продукты с 3 функциями
[
  {
    _id: ObjectId("..."),
    name: "Продвинутый ноутбук",
    features: [ "wifi", "bluetooth", "touchscreen" ],
    accessories: [ "зарядка", "мышь", " футляр" ]
  }
]

// Продукты с 4 аксессуарами
[
  {
    _id: ObjectId("..."),
    name: "Премиум ноутбук",
    features: [ "wifi", "bluetooth", "touchscreen", "4K дисплей" ],
    accessories: [ "зарядка", "мышь", " футляр", "клавиатура" ]
  }
]

Вы также можете комбинировать оператор $size с другими условиями запроса:

// Найти продукты с ровно 3 функциями и более чем 2 аксессуарами
db.products.find({
  features: { $size: 3 },
  accessories: { $size: { $gt: 2 } }
});

Соответствие позиции элемента

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

Сначала запустим MongoDB shell и убедимся, что используем нашу предыдущую базу данных:

mongosh
use arraylab

Создадим новую коллекцию с документами, которые имеют массивы, где позиция элементов имеет значение:

db.courses.insertMany([
  {
    name: "Базовый курс веб-разработки",
    modules: ["HTML", "CSS", "JavaScript", "React", "Node.js"],
    difficulty: ["новичок", "продвинутый", "эксперт"]
  },
  {
    name: "Курс по Data Science",
    modules: [
      "Python",
      "Статистика",
      "Машинное обучение",
      "Глубокое обучение",
      "Искусственный интеллект"
    ],
    difficulty: ["продвинутый", "эксперт", "профессионал"]
  },
  {
    name: "Программа по кибербезопасности",
    modules: [
      "Безопасность сети",
      "Этичный хакинг",
      "Криптография",
      "Тестирование проникновения",
      "Реагирование на инциденты"
    ],
    difficulty: ["продвинутый", "эксперт", "профессионал"]
  }
]);

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

// Найти курсы, где первый модуль - "HTML"
db.courses.find({ "modules.0": "HTML" });

// Найти курсы, где третий модуль - "JavaScript"
db.courses.find({ "modules.2": "JavaScript" });

// Найти курсы, где второй уровень сложности - "продвинутый"
db.courses.find({ "difficulty.1": "продвинутый" });

Пример вывода:

// Курсы с HTML в качестве первого модуля
[
  {
    _id: ObjectId("..."),
    name: "Базовый курс веб-разработки",
    modules: [ "HTML", "CSS", "JavaScript", "React", "Node.js" ],
    difficulty: [ "новичок", "продвинутый", "эксперт" ]
  }
]

// Курсы с JavaScript в качестве третьего модуля
[
  {
    _id: ObjectId("..."),
    name: "Базовый курс веб-разработки",
    modules: [ "HTML", "CSS", "JavaScript", "React", "Node.js" ],
    difficulty: [ "новичок", "продвинутый", "эксперт" ]
  }
]

// Курсы с "продвинутый" в качестве второго уровня сложности
[
  {
    _id: ObjectId("..."),
    name: "Курс по Data Science",
    modules: [ "Python", "Статистика", "Машинное обучение", "Глубокое обучение", "Искусственный интеллект" ],
    difficulty: [ "продвинутый", "эксперт", "профессионал" ]
  },
  {
    _id: ObjectId("..."),
    name: "Программа по кибербезопасности",
    modules: [ "Безопасность сети", "Этичный хакинг", "Криптография", "Тестирование проникновения", "Реагирование на инциденты" ],
    difficulty: [ "продвинутый", "эксперт", "профессионал" ]
  }
]

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

// Найти курсы, где первый модуль - "HTML" и второй уровень сложности - "продвинутый"
db.courses.find({
  "modules.0": "HTML",
  "difficulty.1": "продвинутый"
});

Фильтрация значений массива

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

Сначала запустим MongoDB shell и убедимся, что используем нашу предыдущую базу данных:

mongosh
use arraylab

Создадим коллекцию продуктов с более сложными структурами массивов:

db.electronics.insertMany([
  {
    name: "Смартфон",
    specs: [
      { ram: 6, storage: 128, price: 499 },
      { ram: 8, storage: 256, price: 599 }
    ],
    tags: ["мобильный", "коммуникация", "высокий класс"],
    ratings: [4.5, 4.7, 4.6]
  },
  {
    name: "Ноутбук",
    specs: [
      { ram: 16, storage: 512, price: 1200 },
      { ram: 32, storage: 1024, price: 2000 }
    ],
    tags: ["компьютер", "работа", "профессиональный"],
    ratings: [4.8, 4.9, 4.7]
  },
  {
    name: "Планшет",
    specs: [
      { ram: 4, storage: 64, price: 299 },
      { ram: 8, storage: 256, price: 499 }
    ],
    tags: ["мобильный", "развлечения"],
    ratings: [4.2, 4.3, 4.1]
  }
]);

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

  1. Фильтрация по сравнению элементов массива:
// Найти устройства, у которых хотя бы одна характеристика имеет RAM >= 16
db.electronics.find({
  specs: {
    $elemMatch: { ram: { $gte: 16 } }
  }
});

// Найти устройства с рейтингом выше 4.5
db.electronics.find({
  ratings: { $gt: 4.5 }
});
  1. Использование логических операторов с массивами:
// Найти устройства с тегами "мобильный" и "коммуникация"
db.electronics.find({
  tags: { $all: ["мобильный", "коммуникация"] }
});

// Найти устройства с тегами "работа" или "развлечения"
db.electronics.find({
  tags: { $in: ["работа", "развлечения"] }
});
  1. Сложная фильтрация с несколькими условиями:
// Найти устройства с характеристиками, где RAM >= 8 и цена <= 1000
db.electronics.find({
  specs: {
    $elemMatch: {
      ram: { $gte: 8 },
      price: { $lte: 1000 }
    }
  }
});

Пример вывода:

// Устройства с RAM >= 16
[
  {
    _id: ObjectId("..."),
    name: 'Ноутбук',
    specs: [
      { ram: 16, storage: 512, price: 1200 },
      { ram: 32, storage: 1024, price: 2000 }
    ],
    tags: [ 'компьютер', 'работа', 'профессиональный' ],
    ratings: [ 4.8, 4.9, 4.7 ]
  }
]

// Устройства с рейтингом выше 4.5
[
  {
    _id: ObjectId("..."),
    name: 'Смартфон',
    ratings: [ 4.5, 4.7, 4.6 ]
  },
  {
    _id: ObjectId("..."),
    name: 'Ноутбук',
    ratings: [ 4.8, 4.9, 4.7 ]
  }
]

Резюме

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