Наиболее популярной системой управления базами данных для Node.js на данный момент является MongoDB. Для работы с этой платформой прежде всего необходимо установить сам сервер MongoDB. Подробнее как это сделать, описывается здесь. Кроме самого сервера Mongo для взаимодействия с Node.js нам необходим драйвер.
При подключении и взаимодействии с бд в MongoDB можно выделить следующие этапы:
Подключение к серверу
Получение объекта базы данных на сервере
Получение объекта коллекции в базе данных
Взаимодействие с коллекцией (добавление, удаление, получение, изменение данных)
Итак, создадим новый проект. Для этого определим новый каталог, который будет называться mongoapp. Далее перейдем к этому каталогу в командной строке/терминале и установим пакет mongodb:
npm install mongodb
Стоит отметить, что на момент написания текущей статьи текущая версия драйвера - 6.3.0. Между версиями и даже подверсиями иной раз бывают некоторые отличия. И в этом плане функционал драйвера очень часто меняется. Однако общие моменты часто сохраняются. Всю необходимую справочную информацию конкретно по данному драйверу можно найти на https://docs.mongodb.com/drivers/node/current/
Перед подключением к MongoDB из приложения на Node.js нам естественно сначала надо запустить сам сервер mongodb.
Ключевым классом для работы с MongoDB является класс MongoClient, и через него будет идти все взаимодействия с хранилищем данных. Соответственно вначале мы должны получить MongoClient:
const MongoClient = require("mongodb").MongoClient;
В конструктор MongoClient передается строка подключения к серверу:
"mongodb://user:password@host:port/?options
Элементы строки подключения
Сначала идет протокол, в качестве которого обычно применяется "mongodb".
Затем, если доступ к серверу ограничен логином и паролем, то указывается имя пользователя и через двоеточие пароль ("user:password").
Далее указывает хост и порт, по которому запущен сервер MongoDB (host:port
).
В конце после вопросительного знака ? могут указываться дополнительные параметры подключения (?options
.
Например, определим подключение к локальному серверу MongoDB, который запущен на текущем компьютере на стандартном адресе "127.0.0.1:27017/":
const MongoClient = require("mongodb").MongoClient; const url = "mongodb://127.0.0.1:27017/"; // создаем объект MongoClient и передаем ему строку подключения const mongoClient = new MongoClient(url);
Для подключения к серверу mongodb применяется метод connect():
connect(): Promise<MongoClient>
Метод возвращает Promise, из которого можно получить тот же объект MongoClient:
const MongoClient = require("mongodb").MongoClient; const client = new MongoClient("mongodb://127.0.0.1:27017/"); client.connect().then(mongoClient=>{ console.log("Подключение установлено"); console.log(mongoClient.options.dbName); // получаем имя базы данных });
Метод then()
получает функцию, в которую передается подключенный MongoClient, по сути это тот же объект, что вызвал метод connect.
Для теста с помощью свойства mongoClient.options.dbName
выводим название базы данных, к которой мы подключены (по умолчанию это база данных test).
В конце завершения работы с бд нам надо закрыть соединение с помощью метода close().
const MongoClient = require("mongodb").MongoClient; const client = new MongoClient("mongodb://127.0.0.1:27017/"); client.connect().then(mongoClient=>{ console.log("Подключение установлено"); // какие-нибудь операции с базой данных MongoDB // закрываем подключение mongoClient.close().then(()=>console.log("Подключение закрыто")); });
Метод close()
также возвращает Promise. Соответственно мы можем вызвать метод then()
и в него передать функцию, которая выполняется при закрытии подключения.
Но лепить всю логику взаимодействия через вызовы then() может быть не очень удобно. Поэтому мы также можем использовать другой подход - с использованием async/await:
const MongoClient = require("mongodb").MongoClient; const mongoClient = new MongoClient("mongodb://127.0.0.1:27017/"); async function run() { try { // Подключаемся к серверу await mongoClient.connect(); console.log("Подключение установлено"); // взаимодействие с базой данных }catch(err) { console.log(err); } finally { // Закрываем подключение при завершении работы или при ошибке await mongoClient.close(); console.log("Подключение закрыто"); } } run().catch(console.log);
После подлючения к серверу мы можем обращаться к базе данных на сервере. Для этого используется метод
const db = client.db("название_бд");
В качестве параметра в метод передается название базы данных, к которой мы хотим подключиться. Результатом функции является объект базы данных, через который мы далее уже сможем обращаться к данным в этой БД.
Для примера выполним ping к базе данных "admin", которая по умолчанию есть на сервере MongoDB:
const MongoClient = require("mongodb").MongoClient; const url = "mongodb://127.0.0.1:27017/"; const mongoClient = new MongoClient(url); async function run() { try { // Подключаемся к серверу await mongoClient.connect(); // обращаемся к базе данных admin const db = mongoClient.db("admin"); // выполняем пинг для проверки подключения const result = await db.command({ ping: 1 }); console.log("Подключение с сервером успешно установлено"); console.log(result); }catch(err) { console.log("Возникла ошибка"); console.log(err); } finally { // Закрываем подключение при завершении работы или при ошибке await mongoClient.close(); console.log("Подключение закрыто"); } } run().catch(console.error);
Для выполнения диагностических команд типа пинга объект базы данных Db
предоставляет метод command
, который в качестве первого параметра
принимает объект диагностики. Например, объект {ping: 1}
, указывает, что надо выполнить пинг к базе данных, то есть проверить подключение к ней.
Метод command
представляет Promise, из которого можно получить предоставляет результат проверки. В данном случае результат проверки
возвращается в константу result
.
const result = await db.command({ ping: 1 });
Запустим сервер MongoDb (если он не запущен) и затем запустим наш файл app.js:
Microsoft Windows [Version 10.0.22621.819] (c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены. C:\Users\eugen>cd c:\node\mongoapp c:\node\mongoapp>node app.js Подключение с сервером успешно установлено { ok: 1 } Подключение закрыто c:\node\mongoapp>
Здесь мы видим, что полученный при пинге результат представляет объект {ok: 1}
База данных в MongoDB не имеет таблиц. Вместо этого все данные попадают в коллекции. И в рамках node.js для взаимодействия
с базой данных (добавления, удаления, чтения данных) нам потребуется получить объект коллекции. Для этого применяется метод db.collection("название_коллекции"),
в который передается название коллекции и который возвращает объект класса Collection
, через который мы можем взаимодействовать с этой коллекцией.
В отличие от таблиц в реляционных системах, где все данные хранятся в виде строк, в коллекциях в MongoDB данные хранятся в виде документов. Например, обратимся к коллекции в базе данных. Для этого определим в каталоге проекта следующий файл app.js:
const MongoClient = require("mongodb").MongoClient; const url = "mongodb://127.0.0.1:27017/"; const mongoClient = new MongoClient(url); async function run() { try { await mongoClient.connect(); const db = mongoClient.db("usersdb"); const collection = db.collection("users"); const count = await collection.countDocuments(); console.log(`В коллекции users ${count} документов`); }catch(err) { console.log(err); } finally { await mongoClient.close(); } } run().catch(console.error);
В качестве базы данных здесь используется "usersdb". При этом не важно, что по умолчанию на сервере MongoDB нет подобной базы данных. При первом к ней обращении сервер автоматически ее создаст.
После подключения мы обращаемся к коллекции "users":
const collection = db.collection("users");
Опять же неважно, что такой коллекции по умолчанию нет в бд usersdb, она также будет создана при первом обращении.
Получив коллекцию, мы можем использовать ее методы. В данном случае для простоты применяется метод countDocuments(), который получает количество документов коллекции. Этот метод возвращает Primise, из которого можно получить собственно результат операции - количество документов. Результат работы:
В коллекции users 0 документов