Как подключить Node.js к базе данных MongoDB: инструкция
Во время разработки приложений на Node.js может возникнуть необходимость в хранении данных. Использовать в качестве хранилищ данных переменные приложения или файлы на хосте не всегда удобно. В этих случаях лучше рассмотреть вариант с подключением к приложению внешней базы данных.
Для интеграции с Node.js отлично подходит MongoDB. В этой СУБД данные представлены в JSON-формате, с которым удобно работать на JavaScript. В этом материале мы расскажем, как подключить базу данных MongoDB к своему приложению Node.js, и рассмотрим несколько распространенных запросов к БД.
Тестовая база данных
В качестве тестовой базы данных мы будем использовать базу testdb
, в которой находится коллекция employees. В ней хранится информация о сотрудниках абстрактного предприятия: отдел работы, дата рождения, уровень заработной платы и тому подобная информация. Приложение Node.js будем подключать именно к этой базе данных, а работать будем с коллекцией employees
.
Создание пользователя в MongoDB Compass
Создадим отдельного пользователя, под которым будем подключаться к базе данных. Присвоим этому пользователю роль администратора всех баз данных. В продакшене так делать не стоит — это негативно скажется на безопасности.
В терминале MongoDB Compass выполняем следующий запрос:
db.createUser({
user: "Timeweb",
pwd: "cloud",
roles: [ {role: "userAdminAnyDatabase", db: "testdb"}]
})
Вывод :
{ ok: 1 }
Пользователь с логином «Timeweb» и паролем «cloud» будет использоваться для подключения к БД.
Настройка среды выполнения
Для подключения приложения Node.js к базе данных MongoDB необходимо установить дополнительный пакет mongodb
:
npm install mongodb --save
Подключение
Основным объектом, через который мы будем осуществлять взаимодействие с базой данных 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@localhost:27017/?authMechanism=DEFAULT
- Timeweb — имя пользователя;
- cloud — пароль;
- localhost — IP адрес;
- 27017 — порт;
- DEFAULT — механизм авторизации.
Осуществим подключение к серверу с БД:
const {MongoClient} = require('mongodb')
const MongoDBclient = new MongoClient('mongodb://Timeweb:cloud@localhost: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
. Рассмотрим несколько популярных операций.
Вывод документов
Для обращения к документам базы данных и самой базе данных используется такая конструкция:
MongoClienObject.db('dbname').collection('collectionname').operation
Где:
- MongoClienObject — объект класса MongoClient;
- dbname — имя базы данных, к которой обращаемся;
- collectionname — имя коллекции, к которой обращаемся;
- operation — запрос к БД или коллекции, например, findOne;
Если запрос осуществляется непосредственно к БД, то collection('collectionname')
не указываем.
Выведем все документы в коллекции employees
:
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 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 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 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
Закрыли подключение
Обновление документов
Обновление документов выполняется аналогично предыдущим операциям. Выполним сначала обновление одного документа, а затем обновление нескольких.
Обновление одного документа
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()
Вот результат до и после. С помощью этого скрипта мы изменили имя в документе.
Обновление нескольких документов
const Update = async () =>{
const Update = async () =>{
try {
await MongoDBclient.connect()
console.log("Успешно подключились к базе данных")
const employees = client.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()
Вот результат работы:
Заключение
MongoDB — это отличный инструмент, особенно в связке с Node.js. В этом материале мы использовали локальную базу данных, но можно использовать и другие варианты размещения БД. Например, в облаке. В Timeweb Cloud можно арендовать облачную базу данных MongoDB и начать работать в кратчайшие сроки.