Как подключить mongodb к node js
Перейти к содержимому

Как подключить mongodb к node js

  • автор:

Node.js и MongoDB

Наиболее популярной системой управления базами данных для Node.js на данный момент является MongoDB. Для работы с этой платформой прежде всего необходимо установить сам сервер MongoDB. Подробнее как это сделать, описывается здесь. Кроме самого сервера Mongo для взаимодействия с Node.js нам необходим драйвер.

При подключении и взаимодействии с бд в MongoDB можно выделить следующие этапы:

  1. Подключение к серверу
  2. Получение объекта базы данных на сервере
  3. Получение объекта коллекции в базе данных
  4. Взаимодействие с коллекцией (добавление, удаление, получение, изменение данных)

Итак, создадим новый проект. Для этого определим новый каталог, который будет называться 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

Метод возвращает 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 , который в качестве первого параметра принимает объект диагностики. Например, объект , указывает, что надо выполнить пинг к базе данных, то есть проверить подключение к ней.

Метод 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>

Здесь мы видим, что полученный при пинге результат представляет объект

Коллекции

База данных в 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 $документов`); >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 документов

Как подключить приложение Node.js к базе данных MongoDB

База данных MongoDB – это документо-ориентированная NoSQL база данных. Она предоставляет гибкую структуру данных, которая не обязательно должна соответствовать предварительно определенной схеме. MongoDB хранит данные в формате BSON (Binary JSON), что позволяет эффективно работать с различными типами данных, включая строки, числа, даты, массивы и даже вложенные документы.

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

Node.js – среда выполнения JavaScript, которая позволяет запускать код JavaScript на сервере. Он основан на движке Chrome V8 JavaScript и предоставляет событийно-ориентированную архитектуру и неблокирующий ввод/вывод, что делает его идеальным для разработки масштабируемых и высокопроизводительных веб-приложений. Node.js также предоставляет широкий набор встроенных модулей и поддерживает разработку с помощью сторонних модулей, что делает его гибким инструментом для создания серверных приложений и API.

Интеграция MongoDB с Node.js

Разберем для чего нужна интеграция MongoDB с вашим приложением Node. Она дает ряд преимуществ в процессе использования:

  1. Высокая производительность. MongoDB работает в формате JSON-подобных документов, что делает его идеальным выбором для приложений Node.js, которые взаимодействуют с данными в формате JSON. Это позволяет легко обмениваться данными между Node.js и MongoDB без необходимости выполнять преобразования данных.
  2. Масштабируемость. MongoDB поддерживает горизонтальное масштабирование, что особенно полезно для приложений, которые имеют высокие требования к производительности и обработке большого объема данных.
  3. Гибкость данных. MongoDB позволяет хранить различные типы данных в одной коллекции и добавлять или удалять поля в документе без необходимости выполнять миграции схемы данных.
  4. Возможность использования JavaScript. MongoDB и Node.js оба используют JavaScript, что облегчает разработку приложений с использованием этих двух технологий.

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

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

Как подключить базу данных MongoDB к своему приложению Node.js

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

  1. Перед установкой драйвера MongoDB убедитесь, что у вас установлен Node.js и npm (менеджер пакетов Node.js).
  2. Для установки драйвера введите следующую команду в терминале:

npm install mongodb

  1. Дождитесь завершения установки. После этого драйвер MongoDB будет доступен в вашем проекте Node.js.

Для подключение к базе данных MongoDB:

  1. Создайте новый файл .js в вашем проекте Node.js.
  2. Импортируйте модуль mongodb в ваш файл:

const { MongoClient } = require(‘mongodb’);

  1. Определите URL-адрес вашей базы данных MongoDB в переменной url. Например:

const url = ‘mongodb://localhost:12345/database_name’;

localhost:12345 – адрес и порт вашего MongoDB сервера,

database_name – имя базы данных.

  1. Используйте метод connect() для подключения к базе данных:

MongoClient.connect(url, (err, client) => {

console.log(‘Connected to the database’);

// Здесь можно выполнять операции с базой данных

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

Примеры операций с базой данных MongoDB

С помощью функции connect() вы можете выполнять различные операции с базой данных, используя объект client:

const db = client.db(); // Получить доступ к базе данных

const collection = db.collection(‘mycollection’); // Получить доступ к коллекции

// Выполнить операции с коллекцией

Примеры операций с коллекцией:

  1. Вставка документа:

collection.insertOne({ name: ‘John’, age: 30 }, (err, result) => {

  1. Поиск документов:

collection.find({ name: ‘John’ }).toArray((err, documents) => {

  1. Обновление документа:

collection.updateOne({ name: ‘John’ }, { $set: { age: 31 } }, (err, result) => {

  1. Удаление документа:

collection.deleteOne({ name: ‘John’ }, (err, result) => {

MongoDB в комплексе с Node.js предоставляет разработчикам множество возможностей для работы с базой данных. Они легко интегрируются друг с другом, что облегчает подключение и взаимодействие. Гибкий синтаксис запросов позволяет использовать JavaScript-объекты, делая их понятным для разработчиков Node.js.

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

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

MongoDB¶

MongoDB — документоориентированная (NoSQL) СУБД, хранящая все данные в виде объектов JSON. Отличительная особенность таких баз данных — отсутствие реляционных связей и заранее описанных схем таблиц.

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

Для работы с MongoDB и Node.js имеется специальный официальный драйвер, который устанавливается через npm.

npm install mongodb --save 

Подключение¶

Теперь подключимся к базе.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
const mongo = require('mongodb').MongoClient; mongo.connect( 'mongodb://localhost:27017', (err, client) =>  if (err)  console.log('Connection error: ', err); throw err; > console.log('Connected'); client.close(); > ); 

Подключение осуществляется с помощью метода connect() экземпляра MongoClient , который принимает URL, по которому доступна MongoDB (по умолчанию http://127.0.0.1:27017 ), и callback-функцию, которой передается два параметра:

  • ошибка подключения ( null , если подключение прошло успешно);
  • экземпляр объекта подключения к MongoDB, через API которого создаются новые БД и осуществляется доступ к уже существующим.

После окончания работы с сервером MongoDB не забывайте закрывать соединение с сервером базы данных.

client.close(); 

Создание базы данных¶

Для создания/подключения к базе данных используется метод db() экземпляра объекта подключения, который принимает название БД и возвращает объект для выполнения . Если указанная база не существует, то она будет создана.

const db = client.db('db_name'); 

Физически база данных начинает свое существование только после создания в ней хотя бы одной коллекции (тоже самое, что и таблица в SQL).

Коллекции¶

Коллекции создаются вызовом метода createCollection() , принимающего название коллекции и callback-функцию с ошибкой и результатом в качестве параметров.

const db = client.db('db_name'); const users = db.createCollection('users'); 

Для удаления коллекции используйте применительно к ней метод drop() , который в качестве аргумента принимает callback-функцию с двумя параметрами:

  • ошибка (если удаление прошло успешно — null );
  • объект с успешным результатом.
1 2 3 4 5 6
users.drop((err, result) =>  if (err)  console.log('Unable drop collection: ', err); throw err; > >); 

В отличии от базы данных создание и подключение к коллекции осуществляется двумя разными методами.

Создание записи¶

Теперь создадим в коллекции users первую запись.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14
users.insertOne(  id: 1, login: 'login1', name: 'name1', gender: 'male', >, (err, result) =>  if (err)  console.log('Unable insert user: ', err); throw err; > > ); 

Чтобы вставить сразу несколько записей имеется метод insertMany() .

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
users.insertMany( [  id: 2, login: 'login2', name: 'name2', gender: 'male', >,  id: 3, login: 'login3', name: 'name3', gender: 'female', >, ], (err, result) =>  if (err)  console.log('Unable insert user: ', err); throw err; > > ); 

Получение записи¶

Для получения всех записей в коллекции используйте метод find() экземпляра коллекции.

users.find(); 

Методу find() в качестве параметра можно передать объект, выполняющий роль фильтра для извлекаемых записей. Например, в следующем примере возвращаются все записи, у которых поле gender равно male .

users.find( gender: 'male' >); 

Чтобы получить только первую запись выборки, используйте метод findOne() .

users.findOne(); users.findOne( gender: 'male' >); 

Для получения n-первых записей имеется метод limit() , принимающий количество возвращаемых записей.

users.find().limit(5); 

Сортировка полученного результата осуществляется с помощью метода sort() , который принимает объект, в котором ключ — сортирующее поле, а значение — порядок сортировки ( 1 — по возрастанию, а -1 — по убыванию).

users.find().sort(1); 

Ограничение по выборке и сортировку можно задать в объекте, передаваемом вторым необязательным параметром.

1 2 3 4 5 6 7
users.find( <>,  limit: 5, sort: 1, > ); 

С полным списком параметров можно ознакомиться в официальной документации.

Объединение коллекций¶

Ранее уже упоминалось, что в MongoDB отсутствуют реляционность, тем не менее в ней возможно объединений коллекций по принципу LEFT JOIN в SQL с помощью метода aggregate() .

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
users .aggregate([  $lookup:  from: 'rooms', localField: 'room_id', foreignField: 'id', as: 'room_details', >, >, ]) .toArray((err, res) =>  if (err)  console.log('Aggregate error: ', err); throw err; > console.log(res); >); 

Метод aggregate() принимает массив с описанием объединений с другими коллекциями. Объединение определяется объектом с ключом $lookup , значением для которого служит объект конфигурации со следующими свойствами:

  • from — название коллекции, с которой происходит слияние;
  • localField — наименование поля, по которому будет осуществляться объединение с внешней коллекцией;
  • foreignField — наименование объединяющего поля из внешней коллекции;
  • as — название поля в текущей коллекции, которое будет содержать данные, полученные в результате слияния.

Обновление записи¶

Обновление записи происходит с помощью метода updateOne() , который принимает условие для записей, которые необходимо обновить, и объект со свойством $set , в значении которого указываются, какие именно поля нужно изменить.

 1 2 3 4 5 6 7 8 9 10
users.updateOne(  id: 1 >,  $set:  gender: 'female' > >, (err, result) =>  if (err)  console.log('Unable update user: ', err); throw err; > > ); 

Удаление записи¶

За удаление записей отвечают методы deleteOne() и deleteMany() .

1 2 3 4 5 6
users.deleteOne( id: 3 >, (err, result) =>  if (err)  console.log('Unable delete user: ', err); throw err; > >); 

Более подробную информацию о возможностях драйвера для Node.js MongoDB можно получить на официальном сайте.

Как подключить mongodb к node js

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

Для добавления мы можем использовать различные методы. Если нужно добавить один объект, то применяется метод insertOne() . При добавлении набора объектов можно использовать метод insertMany() .

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

Для добавления одного документа применяется метод insertOne() . В качестве параметра он принимает добавляемый документ. Рассмотрим на примере:

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 user = ; const result = await collection.insertOne(user); console.log(result); console.log(user); >catch(err) < console.log(err); >finally < await mongoClient.close(); >> run().catch(console.error);

Добавляемый документ представляет объект. В данном случае это объект

То есть в коллекцию users будет добавляться документ, который имеет для свойства: name и age , которые хранят соответветственно строку «Tom» и число 23.

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

Результат работы программы:

c:\node\mongoapp>node app < acknowledged: true, insertedId: new ObjectId("6112a80ca8a25160d53d161a") >

Здесь мы можем увидеть результат операции, в частности, с помощью свойства result. insertedId получить идентификатор добавленного объекта. Кроме того, мы видим, кроме начальных свойств документ user после добавления в БД получили дополнительное свойство _id — это уникальный идентификатор документа, который присваивается сервером при добавлении.

Добавление нескольких объектов

Теперь используем метод insertMany() . Добавим набор объектов и для этого изменим файл приложения app.js:

const MongoClient = require("mongodb").MongoClient; const url = "mongodb://127.0.0.1:27017/"; const mongoClient = new MongoClient(url); const users = [ , , ]; async function run() < try < await mongoClient.connect(); const db = mongoClient.db("usersdb"); const collection = db.collection("users"); const results = await collection.insertMany(users); console.log(results); console.log(users); >catch(err) < console.log(err); >finally < await mongoClient.close(); >> run().catch(console.error);

Как и insertOne, метод insertMany() в качестве параметра принимает добавляемые данные — массив объектов, а в качестве результата возвращает результат операции. При удачном добавлении добавленные объекты из массива users аналогичным образом получат свойство _id .

c:\node\mongoapp>node app < acknowledged: true, insertedCount: 3, insertedIds: < '0': new ObjectId("6377874e1e1a085c14fcd12f"), '1': new ObjectId("6377874e1e1a085c14fcd130"), '2': new ObjectId("6377874e1e1a085c14fcd131") >> [ < name: 'Bob', age: 35, _id: new ObjectId("6377874e1e1a085c14fcd12f") >, < name: 'Alice', age: 21, _id: new ObjectId("6377874e1e1a085c14fcd130") >, < name: 'Tom', age: 45, _id: new ObjectId("6377874e1e1a085c14fcd131") >] c:\node\mongoapp>

Объект результата в свойстве insertedCount содержит количество добавленных документов, а через свойство insertedIds можно получить идентификаторы добавленных документов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *