Во время разработки приложений на 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()
Вот результат до и после. С помощью этого скрипта мы изменили имя в документе.
Обновление нескольких документов
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()
Вот результат работы:
Разверните MongoDB в облаке за пару минут
447 ₽/мес
711 ₽/мес
Заключение
MongoDB — это отличный инструмент, особенно в связке с Node.js. В этом материале мы использовали локальную базу данных, но можно использовать и другие варианты размещения БД. Например, в облаке. В Timeweb Cloud можно арендовать облачную базу данных MongoDB и начать работать в кратчайшие сроки.
