Во время разработки приложений на Node.js может возникнуть необходимость в хранении данных. Использовать в качестве хранилищ данных переменные приложения или файлы на хосте не всегда удобно. В этих случаях лучше рассмотреть вариант с подключением к приложению внешней базы данных.
Для интеграции с Node.js отлично подходит MongoDB. В этой СУБД данные представлены в JSON-формате, с которым удобно работать на JavaScript. В этом материале мы расскажем, как подключить базу данных MongoDB к своему приложению Node.js, и рассмотрим несколько распространенных запросов к БД.
Эта инструкция подойдет для Node.js версии 14 и выше и MongoDB версии 4.4 и выше.
В качестве тестовой базы данных мы будем использовать базу testdb
, в которой находится коллекция employees. В ней хранится информация о сотрудниках абстрактного предприятия: отдел работы, дата рождения, уровень заработной платы и тому подобная информация. Приложение Node.js будем подключать именно к этой базе данных, а работать будем с коллекцией employees
.
Создадим отдельного пользователя, под которым будем подключаться к базе данных. Присвоим этому пользователю роль администратора всех баз данных. В продакшене так делать не стоит — это негативно скажется на безопасности.
Откройте терминал 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
Осуществим подключение к серверу с БД:
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
Где:
Если запрос осуществляется непосредственно к БД, то 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 в облаке за пару минут
MongoDB — это отличный инструмент, особенно в связке с Node.js. В этом материале мы использовали локальную базу данных, но можно использовать и другие варианты размещения БД. Например, в облаке. В Timeweb Cloud можно арендовать облачную базу данных MongoDB и начать работать в кратчайшие сроки.
Вас ничего не смущает что async/await появились в ноде с 20 версии ? почему вы все пишете под копирку даже не думая ? Это такой способ раскрутки?
Добрый день, Сергей! Спасибо за комментарий. Мы ценим ваш вклад в поддержание точности и актуальности наших материалов.
Что касается async/await в Node.js, то они были введены в JavaScript с ES2017 и стали доступны в Node.js начиная с версии 7.6.0, которая была выпущена в феврале 2017 года. Вы можете проверить эту информацию, обратившись к официальной документации ECMAScript 2017 и к заметкам о выпуске Node.js 7.6.0.
Если у вас есть какие-либо дополнительные вопросы или замечания, напишите нам, разберемся вместе)