Как работать с запросами MongoDB: оптимизация, примеры

    Команда Simple-Server
    03.06.2026
    7 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

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

    В коллекциях хранятся документы — это объекты, по своему формату напоминающие JSON. Документ с информацией о сотруднике может выглядеть примерно так:

    { name: "Ivan", patronymic: "Sergeevich", surname: "Antonov", age: "25", salary: "100000", department: "marketing", date of birth: "15.02.1997" }

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

    Запросы на уровне баз данных и коллекций

    Мы будем писать и составлять запросы в Mongodb Compass. Подробнее об установке MongoDB на различные операционные системы можно прочитать в статье «Установка MongoDB на разные ОС: Windows, Ubuntu, CentOS». После установки на локальном сервере будет размещено 3 базы данных:

    Чтобы вывести их воспользуемся запросом show databases:

    admin   40.00 KiB config  60.00 KiB local   40.00 KiB

    Также можно использовать сокращенный вариант — show dbs:

    admin   40.00 KiB config  60.00 KiB local   40.00 KiB

    Чтобы перейти к работе с определенной базой данных используется запрос use:

    use testdb 'switched to db testdb'

    Базы данных с названием testdb на нашем сервере не было. Если терминал при выполнении запроса use не находит соответствующую БД, то он создает новую с таким же названием.

    Для создания коллекций используется команда db.createCollection ("название коллекции"). Создадим в базе данных testdb коллекцию:

    db.createCollection('cloud') { ok: 1 } show collections cloud

    Чтобы удалить коллекцию используем команду drop():

    db.cloud.drop() true show collections

    Для удаления всей базы данных, во время работы с ней используем запрос db.dropDataBase():

    { ok: 1, dropped: 'testdb' }

    Добавление и удаление документов

    Восстановим базу данных и создадим в ней коллекцию:

    use testdb 'switched to db testdb' db.createCollection('employees') { ok: 1 }

    И добавим в неё первый документ:

    db.employees.insert({ name: "Ivan", patronymic: "Sergeevich", surname: "Antonov", age: 25, salary: 100000, department: "marketing", date_of_birth: "15.02.1997" }) 'DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.' { acknowledged: true, insertedIds: { '0': ObjectId("637c9cbd7025c2523a76fe64") } }

    После выполнения insert терминал сообщит, что для оптимизации запросов стоит использовать методы insertOne, insertMany или bulkWrite. insert является устаревшим методом.

    insertOne добавляет в коллекцию один документ:

    db.employees.insertOne({ name: "Sergey", patronymic: "Valentinovich", surname: "Konopatka", age: 35, salary: 200000, department: "QA", date_of_birth: "12.06.1987" }) { acknowledged: true, insertedId: ObjectId("637ca6127025c2523a76fe65") }

    insertMany**** добавляет массив документов в коллекцию:

    db.employees.insertMany( [{ name: "Andrew", patronymic: "Stepanovich", surname: "Limonov", age: 19, salary: 50000, department: "Tech Support", date_of_birth: "15.10.2003" }, { name: "Alexei", patronymic: "Vadimovich", surname: "Pasechnikov", age: 43, salary: 300000, department: "HR", date_of_birth: "6.05.1979" }] ) { acknowledged: true insertedIds: { '0': ObjectId("637ca7817025c2523a76fe66"), '1': ObjectId("637ca7817025c2523a76fe67") } }

    bulkWrite**** выполняет несколько операций, связанных со вставкой, удалением и обновлением документов:

    db.employees.bulkWrite([{ insertOne: {name: "Michail", patronymic: "Bogdanovich", surname: "Gurov", age: 30, salary: 220000, department: "Tech Support", date_of_birth: "10.01.1992" } }]) { acknowledged: true, insertedCount: 1, insertedIds: { '0': ObjectId("637cafaa7025c2523a76fe68") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} }

    Запрос find() — это аналог SELECT из SQL. С помощью этого запроса в MongoDB осуществляется поиск и вывод документов коллекции. Для начала выведем все документы в коллекции employees:

    Также документы можно просмотреть в графическом клиенте:

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

    db.employees.find({salary: 50000})

    Если параметров несколько, их нужно перечислить через запятую:

    db.employees.find({salary: 50000, name: 'Andrew'})

    Для задания условия ИЛИ в поиске используется $or:

    db.employees.find({$or: [{salary: 50000},{name: 'Alexei'}]})

    Для сравнения используются следующие операторы сравнения:

    • $lt — less than, меньше;
    • $lte — less than or equal, меньше или равно;
    • $gt — greater than, больше;
    • $gte — greater than or equal, больше или равно;
    • $ne — not equal, не равно.

    В качестве примера найдем людей с зарплатой больше 100000 и моложе 30:

    db.employees.find({salary : {$gte: 100000},age: {$lt:30}})

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

    db.employees.find().sort({age:1})

    Чтобы ограничить количество документов в выводе, используется метод limit():

    db.employees.find().sort({age:1}).limit(2)

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

    db.employees.update({name: 'Ivan'}, { $set:{ name: 'Anatoly', age: 50, date_of_birth: '15.11.1972'} }) db.employees.find({name: 'Anatoly'})

    Для изменения названия полей используется параметр $rename:

    db.employees.updateMany({}, { $rename:{ name: 'first_name'} })

    В данном случае мы используем updateMany. По умолчанию update изменяет один документ. Для обновления нескольких документов необходимо использовать updateMany или присвоить параметру multi значение true.

    Для удаления документов в MongoDB предусмотрено 2 функции — deleteOne() и deleteMany().

    deleteOne() удалит первый подходящий под критерии документ:

    db.employees.deleteOne({first_name: 'Alexei'}) { acknowledged: true, deletedCount: 1 }

    deleteMany() удалит все подходящие под критерии документы:

    db.employees.deleteMany({department: 'Tech Support'}) { acknowledged: true, deletedCount: 2 }

    В итоге в коллекции employees осталось 2 документа:

    Оптимизация запросов MongoDB

    Чтобы ваши запросы выполнялись быстрее, руководствуйтесь следующими советами:

    • Для часто используемых запросов создайте индексы.
    • Ограничьте количество выводимых документов. MongoDB возвращают в результате поиска все найденные документы. Если вы хотите просмотреть только часть ответа, то используете в запросе метод limit().
    • Если вам нужны не все поля в документах, то вы можете повысить производительность запроса, возвращая в качестве результата поиска только нужные поля.
    • Используйте более «избирательные» запросы. Например, проверка по _id вернет не больше одного документа. Стремитесь использовать в запросах параметры, которые наиболее точно описывают нужные вам документы.

    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны