Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

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

4762
10 минут чтения
Средний рейтинг статьи: 5

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

Для интеграции с Node.js отлично подходит MongoDB. В этой СУБД данные представлены в JSON-формате, с которым удобно работать на JavaScript. В этом материале мы расскажем, как подключить базу данных MongoDB к своему приложению Node.js, и рассмотрим несколько распространенных запросов к БД.

Эта инструкция подойдет для Node.js версии 14 и выше и MongoDB версии 4.4 и выше.

Тестовая база данных

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

Создание пользователя в MongoDB Compass

Создадим отдельного пользователя, под которым будем подключаться к базе данных. Присвоим этому пользователю роль администратора всех баз данных. В продакшене так делать не стоит — это негативно скажется на безопасности.

Откройте терминал MongoDB Shell и выполните следующий запрос:

    
> use admin
> db.createUser({
user: "Timeweb",
pwd: "cloud",
roles: [
{ role: "userAdmin", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" }
]
})

Вывод :

    
{ ok: 1 }

Пользователь с логином «Timeweb» и паролем «cloud» будет использоваться для подключения к БД.

Настройка среды выполнения

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

    
npm install mongodb --save npm install mongodb-core --save

DBaaS

Запустите свою базу данных в облаке и
оптимизируйте процессы DevOps и CI/CD.

Подключение

Основным объектом, через который мы будем осуществлять взаимодействие с базой данных MongoDB, является объект класса MongoClient. Импортируем этот класс:

    
const {MongoClient} = require('mongodb')

И объявляем объект DBclient с помощью конструктора:

    
const MongoDBclient = new MongoClient('URI')

На вход конструктору класса подаётся URI, который содержит в себе информацию о пользователе, IP и порте сервера. Вот структура URI:

    
mongodb://login:password@IP:PORT/?authMechanism=method

В случае с размещенной на локальном устройстве БД, URI имеет следующий вид:

    
mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT
  • Timeweb — имя пользователя;
  • cloud — пароль;
  • 27017 — порт;
  • DEFAULT — механизм авторизации.

Осуществим подключение к серверу с БД:

    
const {MongoClient} = require('mongodb') const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT')

const connect = async () =>{
   try {
       await MongoDBclient.connect()
       console.log("Успешно подключились к базе данных")
       await MongoDBclient.close()
       console.log("Закрыли подключение")
   } catch (e) {
       console.log(e)
   }
}

connect()

Вывод:

    
Успешно подключились к базе данных Закрыли подключение

Любые взаимодействия с базой данных — это асинхронные операции. Поэтому вместе с ними необходимо использовать async и await. Рассмотрим несколько популярных операций.

Вставка новых документов

Вставка новых документов осуществляется выполнением запроса к БД с данными о документах в качестве аргумента.

Вставка одного документа

    
const {MongoClient} = require('mongodb') const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT') const employee = {    patronymic: 'Olegovich',    surname: 'Eparskii',    age: 45,    salary: 260000,    department: 'DevRel',    date_of_birth: '15.11.1977',    first_name: 'Anton' } const Insert = async () =>{    try {        await MongoDBclient.connect()        console.log("Успешно подключились к базе данных")        const employees = MongoDBclient.db('testdb').collection('employees')        await employees.insertOne(employee)        await MongoDBclient.close()        console.log("Закрыли подключение")    } catch (e) {        console.log(e)    } } Insert()

Вставка нескольких документов

    
const {MongoClient} = require('mongodb') const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT') const ManyEmployees = [{    patronymic: 'Vasiilevich',    surname: 'Brezhnev',    age: 27,    salary: 160000,    department: 'Legal Department',    date_of_birth: '12.05.1995',    first_name: 'Pavel' },    {        patronymic: 'Yurievich',        surname: 'Blinov',        age: 30,        salary: 200000,        department: 'Tech Support',        date_of_birth: '06.02.1992',        first_name: 'Arkadiy'    }] const Insert = async () =>{    try {        await MongoDBclient.connect()        console.log("Успешно подключились к базе данных")        const employees = MongoDBclient.db('testdb').collection('employees')        await employees.insertMany(ManyEmployees)        await MongoDBclient.close()        console.log("Закрыли подключение")    } catch (e) {        console.log(e)    } } Insert()

Проверим общее количество документов в коллекции после вставок:

    
const {MongoClient} = require('mongodb') const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT') const Count = async () =>{    try {        await MongoDBclient.connect()        console.log("Успешно подключились к базе данных")        const AllDocuments = await MongoDBclient.db('testdb').collection('employees').find().toArray()        console.log("Количество документов в базе данных:", AllDocuments.length)        await MongoDBclient.close()        console.log("Закрыли подключение")    } catch (e) {        console.log(e)    } } Count()

 Вывод:

    
Успешно подключились к базе данных Количество документов в базе данных: 5 Закрыли подключение

Вывод документов

Для обращения к документам базы данных и самой базе данных используется такая конструкция:

    
MongoClienObject.db('dbname').collection('collectionname').operation

Где:

  • MongoClienObject — объект класса MongoClient;
  • dbname — имя базы данных, к которой обращаемся;
  • collectionname — имя коллекции, к которой обращаемся;
  • operation — запрос к БД или коллекции, например, findOne;

Если запрос осуществляется непосредственно к БД, то collection('collectionname') не указываем.

Выведем все документы в коллекции employees:

    
const {MongoClient} = require('mongodb') const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT') const Find = async () =>{    try {        await MongoDBclient.connect()        console.log("Успешно подключились к базе данных")        const AllDocuments = await MongoDBclient.db('testdb').collection('employees').find().toArray()        console.log(AllDocuments)        await MongoDBclient.close()        console.log("Закрыли подключение")    } catch (e) {        console.log(e)    } } Find()

 Вывод:

    
Подключение прошло успешно [                                                    {                                                    _id: new ObjectId("637c9cbd7025c2523a76fe64"),     patronymic: 'Sergeevich',                          surname: 'Antonov',                                age: 50,                                           salary: 100000,                                    department: 'marketing',                           date_of_birth: '15.11.1972',                       first_name: 'Anatoly'                            },                                                 {                                                    _id: new ObjectId("637ca6127025c2523a76fe65"),     patronymic: 'Valentinovich',     surname: 'Konopatka',     age: 35,     salary: 200000,     department: 'QA',     date_of_birth: '12.06.1987',     first_name: 'Sergey'   } ] Подключение закрыто

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

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

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

    
const {MongoClient} = require('mongodb') const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT') const Update = async () =>{    try {        await MongoDBclient.connect()        console.log("Успешно подключились к базе данных")        const employees = MongoDBclient.db('testdb').collection('employees')        await employees.findOneAndUpdate({first_name: 'Anton'} , { $set: {first_name: "Antoshka"}})        await MongoDBclient.close()        console.log("Закрыли подключение")    } catch (e) {        console.log(e)    } } Update()

Вот результат до и после. С помощью этого скрипта мы изменили имя в документе.

Image2

Обновление нескольких документов

    
const {MongoClient} = require('mongodb') const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@127.0.0.1:27017/?authMechanism=DEFAULT') const Update = async () =>{    try {        await MongoDBclient.connect()        console.log("Успешно подключились к базе данных")      const employees = MongoDBclient.db('testdb').collection('employees')        await employees.updateMany({$or:[{department: 'DevRel'},{department: 'marketing'}]} , { $set: {department: "PR"}})

       await MongoDBclient.close()
       console.log("Закрыли подключение")
   } catch (e) {
       console.log(e)
   }
}

Update()

Вот результат работы:

Image1

Разверните MongoDB в облаке за пару минут

Cloud DB 1/1/8

447 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
Диск NVMe
8 ГБ
Приватный IP
Есть
Резервные копии
Есть
Cloud DB 1/2/20

711 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
Диск NVMe
20 ГБ
Приватный IP
Есть
Резервные копии
Есть
Таблица тарифов
Сравнение тарифов
Cloud DB 1/1/8
496
Cloud DB 1/2/20
790
Cloud DB 2/2/30
1160
Cloud DB 2/4/40
1580
Cloud DB 4/8/80
3160
Cloud DB 4/12/120
4240
Cloud DB 6/12/180
5460
Cloud DB 8/16/220
7040
Процессор1 x 3.3 ГГц1 x 3.3 ГГц2 x 3.3 ГГц2 x 3.3 ГГц4 x 3.3 ГГц4 x 3.3 ГГц6 x 3.3 ГГц8 x 3.3 ГГц
Память1 ГБ2 ГБ2 ГБ4 ГБ8 ГБ12 ГБ12 ГБ16 ГБ
Диск NVMe8 ГБ20 ГБ30 ГБ40 ГБ80 ГБ120 ГБ180 ГБ220 ГБ
Приватный IPЕстьЕстьЕстьЕстьЕстьЕстьЕстьЕсть
Резервные копииЕстьЕстьЕстьЕстьЕстьЕстьЕстьЕсть

Заключение

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

4762
10 минут чтения
Средний рейтинг статьи: 5

Читайте также

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
Пока нет комментариев