Что такое MongoDB?

MongoDB — это документо-ориентированная база данных NoSQL, в которой данные хранятся в формате JSON-подобных документов. Она используется для хранения больших объемов данных и отличается гибкостью структуры и высокой производительностью.

Основные понятия:

1. Коллекция (“collection”)

  • Аналог таблицы в реляционных базах данных.
  • Хранит группу документов.
  • В одной коллекции могут быть документы с разной структурой (необязательно одинаковыми полями).

2. Документ (“document”)

  • Основная единица хранения данных в MongoDB.
  • Представляет собой JSON-подобный объект (в формате BSON — Binary JSON).

Особенности MongoDB:

  • Гибкая схема: можно добавлять документы с разными полями.
  • Хорошо масштабируется горизонтально.
  • Подходит для приложений, где важна скорость и гибкость (например, веб-приложения, аналитика).

Команда db.users.find() используется в MongoDB для поиска (чтения) всех документов в коллекции users.

Что делает:

  • Обращается к коллекции users.
  • Возвращает все документы, которые в ней находятся.

Команда db.users.find({ age: { $lt: 30 } }) в MongoDB используется для поиска всех документов, в которых значение поля age (возраст) меньше 30.

  • db.users — обращение к коллекции users.
  • .find(...) — метод поиска документов.
  • { age: { $lt: 30 } } — условие:
  • age — поле, по которому фильтруем.
  • $lt (less than) — оператор “меньше”.
  • 30 — значение, с которым сравниваем.

Команда db.users.find({ age: { $lte: 28 } }) используется для поиска всех документов, у которых поле age (возраст) меньше или равно 28.

  • db.users — коллекция users.
  • .find(...) — поиск документов.
  • { age: { $lte: 28 } } — фильтр:
  • age — поле “возраст”.
  • $lte — оператор “меньше или равно” (less than or equal).
  • 28 — значение, с которым сравниваем.

Команда db.users.find({ age: { $gt: 30 } }) в MongoDB используется для поиска всех документов, у которых поле age (возраст) строго больше 30.

  • db.users — коллекция users.
  • .find(...) — метод поиска.
  • { age: { $gt: 30 } } — условие:
  • age — поле “возраст”.
  • $gt (greater than) — больше.
  • 30 — значение, с которым сравниваем.

Команда db.users.find({ age: { $gte: 28 } }) используется для поиска всех документов, у которых поле age (возраст) больше или равно 28.

  • db.users — обращение к коллекции users.
  • .find(...) — метод поиска.
  • { age: { $gte: 28 } } — фильтр:
  • age — поле “возраст”.
  • $gte — оператор “больше или равно” (greater than or equal).
  • 28 — значение для сравнения.

Команда db.users.find({ $or: [ { name: "ulbitv" }, { age: 35 } ] }) используется для поиска документов, которые соответствуют хотя бы одному из условий.

  • $or — логический оператор ИЛИ.
  • [ {...}, {...} ] — массив условий.

Условие выполнится, если хотя бы одно из указанных условий верно:

  • имя пользователя — "ulbitv"
    ИЛИ
  • возраст — 35

Команда db.users.find({ age: { $ne: 28 } }) используется в MongoDB для поиска всех документов, в которых поле age не равно 28.

  • age — поле “возраст”.
  • $ne (not equal) — оператор “не равно”.
  • 28 — значение, которое исключается из результатов.

Команда db.users.find().sort({ age: -1 }) используется в MongoDB для получения всех документов из коллекции users, отсортированных по убыванию значения поля age.

  • find() — получает все документы.
  • sort({ age: -1 }) — сортирует результаты по полю age:
  • -1 означает по убыванию (от большего к меньшему).
  • 1 означал бы сортировку по возрастанию.

Команда db.users.find().sort({ age: 1 }) в MongoDB используется для получения всех документов из коллекции users, отсортированных по возрасту (age) в порядке возрастания.

  • find() — получает все документы из коллекции users.
  • sort({ age: 1 }) — сортирует по полю age:
  • 1по возрастанию (от меньшего к большему).
  • -1 — по убыванию (если нужно наоборот).

Команда db.users.deleteOne({ age: 24 }) используется в MongoDB для удаления одного документа из коллекции users, в котором поле age равно 24.

  • deleteOne() — удаляет первый найденный документ, который соответствует условию.
  • { age: 24 } — фильтр поиска документа с возрастом 24.

Что происходит:

  • Если в коллекции есть несколько документов с age: 24, будет удалён только первый найденный.
  • Если документов с таким возрастом нет, ничего не удалится.

Команда db.users.find().limit(4) в MongoDB используется для получения первых 4 документов из коллекции users.

  • find() — выбирает все документы из коллекции users.
  • limit(4) — ограничивает количество возвращаемых документов до 4.

Если в коллекции 10 пользователей, то результатом будет первые 4 документа (в порядке по умолчанию).

Команда db.users.findOne({_id: ObjectId('682d83902fab332b428eeeee')}) используется в MongoDB для поиска одного документа в коллекции users по его уникальному идентификатору _id.

  • findOne() — возвращает первый документ, который соответствует условию.
  • {_id: ObjectId('682d83902fab332b428eeeee')} — фильтр по полю _id:
  • _id — уникальный идентификатор документа в MongoDB.
  • ObjectId('...') — специальный тип данных, используемый для хранения _id.

Что делает команда:

  • Ищет документ с конкретным _id.
  • Возвращает один документ (или null, если не найден).

Команда используется в MongoDB для переименования поля name в fullname во всех документах коллекции users.

  • updateMany() — обновляет все документы, которые соответствуют фильтру.
  • {} — пустой фильтр, значит обновляем все документы в коллекции.
  • $rename — оператор обновления, который переименовывает поле:
    • name — старое имя поля.
    • fullname — новое имя поля.

Что происходит:

  • Во всех документах коллекции users поле name будет заменено на fullname.
  • Если у документа нет поля name, он не изменится.

Команда используется в MongoDB для выполнения нескольких операций обновления (bulk операции) за один запрос.

db.users.bulkWrite([
    {
        insertOne: {
            document: {fullname: "nastya", age:18}
        }
    },
    {
        deleteOne: {
            filter: {fullname: "petya"}
        }
    }
    ]
)
  • bulkWrite() — выполняет несколько операций (вставка, удаление, обновление) в одной транзакции.
  • В массиве передаются объекты с операциями:
  1. insertOne — вставить новый документ
  2. deleteOne — удалить один документ

Что происходит:

  • Добавляется новый пользователь nastya с возрастом 18.
  • Удаляется первый найденный пользователь с fullname: "petya".

Почему bulkWrite полезен:

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

Команда

db.users.update(
    {fullname: "nastya"},
    {
        $set: {
            posts: [
                {title: 'javascript', text: 'js top'},
                {title: 'mongo', text: 'mongo database'}
            ]
        }
    }
)

используется в MongoDB для обновления первого документа, где fullname равен "nastya", и добавления (или замены) поля posts с массивом постов.

  • { fullname: "nastya" } — фильтр, ищем пользователя с таким именем.
  • $set — оператор обновления, который устанавливает или заменяет указанное поле.
  • posts — новое поле, содержащее массив объектов с информацией о постах.

Что происходит:

  • В документе пользователя nastya поле posts будет создано или перезаписано массивом:
[
  { "title": "javascript", "text": "js top" },
  { "title": "mongo", "text": "mongo database" }
]

Команда

db.users.findOne(
    {fullname: "nastya"},
    {posts:1} //хотим увидеть все posts
)

используется в MongoDB для поиска одного документа, где fullname равно "nastya", и вывода только поля posts.

Команда

db.users.find(
    {
        posts: {
            $elemMatch: {
                title: "javascript"
            }
        }
    }
)

используется в MongoDB для поиска всех документов, у которых в массиве posts есть элемент с полем title, равным "javascript".

Разбор команды:

  • posts — поле-массив в документе.
  • $elemMatch — оператор, который ищет элемент массива, удовлетворяющий заданному условию.
  • { title: "javascript" } — условие для элемента массива.

Что делает команда:

  • Возвращает все документы, где в posts есть хотя бы один объект с "title": "javascript".

Команда db.users.find({posts:{$exists:true}}) используется в MongoDB для поиска всех документов, у которых есть поле posts.

Разбор команды:

  • posts — поле, которое проверяется.
  • $exists: true — оператор, который возвращает документы, где поле posts существует (то есть не null и не отсутствует).

Что делает команда:

  • Возвращает все документы, у которых есть поле posts (независимо от значения).

Как подключиться к MongoDB Atlas (облачная версия MongoDB) с помощью PHP:

1. Что нужно заранее

  • PHP версии 7.1 или выше
  • Установленный Composer — менеджер пакетов для PHP
  • Аккаунт на MongoDB Atlas
  • Установленное расширение mongodb для PHP

2. Установка необходимых компонентов

2.1
Для Windows:

  1. На сайте: https://pecl.php.net/package/mongodb cкачать нужную версию .dll
    • Выбрать правильную версию DLL-файла расширения mongodb для Windows нужно, ориентируясь на:
      • Разрядность (x64 или x86) — зависит от PHP (можно точно проверить командой php -i | findstr Architecture)
      • Thread Safety (TS) или Non Thread Safe (NTS) — зависит от сборки PHP
        Это можно узнать командой: php -i | findstr “Thread”.
        Если выводит Thread Safety => enabled, значит нужна Thread Safe (TS) версия.
  2. Поместить её в папку ext PHP (C:\xampp\php\ext)
  3. Добавить в php.ini (C:\xampp\php):
    extension=mongodb
  4. Проверить, что расширение установлено:

2.2
Установка библиотеки MongoDB через Composer
:

Открыть терминал в папке с проектом и выполнить:
composer require mongodb/mongodb

3. Получить строку подключения к MongoDB Atlas

  • Войти в свой аккаунт на MongoDB Atlas
  • Выбрать свой кластер → Connect
  • Выбрать “Connect your application”
  • Выбрать драйвер PHP и скопировать строку подключения

4. Пример подключения и вставки данных в MongoDB через PHP

<?php
require 'vendor/autoload.php';

use MongoDB\Client;
use MongoDB\Driver\Exception\Exception as MongoException;

try {
    // 1. Подключение к MongoDB
    $uri = " "; // строка подключения для каждого своя
    $client = new Client($uri);

    // 2. Проверка подключения
    $client->listDatabases(); // Простая проверка соединения

    // 3. Выбор базы и коллекции
    $database = 'mongodb'; // Название БД
    $collectionName = 'users'; // Название коллекции

    $collection = $client->$database->$collectionName;

    // 4. Вставка документа
    $result = $collection->insertOne([
        'name' => 'Lilith',
        'age' => 25,
        'created_at' => new MongoDB\BSON\UTCDateTime()
    ]);

    // 5. Вывод результата
    echo "Успешно добавлен документ с ID: " . $result->getInsertedId();

} catch (MongoException $e) {
    // Обработка ошибок MongoDB
    echo "Ошибка MongoDB: " . $e->getMessage();
} catch (Exception $e) {
    // Общие ошибки
    echo "Ошибка: " . $e->getMessage();
}
?>