Бесплатная миграция IT-инфраструктуры в облако

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

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
28 декабря 2022 г.
3496
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

Подключение

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

Заключение

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

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
28 декабря 2022 г.
3496
10 минут чтения
Средний рейтинг статьи: 5
Комментарии 2
Sergey Gromov
Sergey Gromov
16.05.2023, 11:39

Вас ничего не смущает что async/await появились в ноде с 20 версии ? почему вы все пишете под копирку даже не думая ? Это такой способ раскрутки?

Команда Timeweb Cloud
Команда Timeweb Cloud
16.05.2023, 15:19

Добрый день, Сергей! Спасибо за комментарий. Мы ценим ваш вклад в поддержание точности и актуальности наших материалов.

Что касается async/await в Node.js, то они были введены в JavaScript с ES2017 и стали доступны в Node.js начиная с версии 7.6.0, которая была выпущена в феврале 2017 года. Вы можете проверить эту информацию, обратившись к официальной документации ECMAScript 2017 и к заметкам о выпуске Node.js 7.6.0.

Если у вас есть какие-либо дополнительные вопросы или замечания, напишите нам, разберемся вместе)