Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
В качестве тестовой базы данных мы будем использовать базу testdb, в которой находится коллекция employees. В ней хранится информация о сотрудниках абстрактного предприятия: отдел работы, дата рождения, уровень заработной платы и тому подобная информация. Приложение Node.js будем подключать именно к этой базе данных, а работать будем с коллекцией employees.
Создание пользователя в MongoDB Compass
Создадим отдельного пользователя, под которым будем подключаться к базе данных. Присвоим этому пользователю роль администратора всех баз данных. В продакшене так делать не стоит — это негативно скажется на безопасности.
Откройте терминал MongoDB Shell и выполните следующий запрос:
> use admin
> db.createUser({
user: "Simple-Server",
pwd: "cloud",
roles: [
{ role: "userAdmin", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" }
]
})Пользователь с логином «Simple-Server» и паролем «cloud» будет использоваться для подключения к БД.
Настройка среды выполнения
Для подключения приложения Node.js к базе данных MongoDB необходимо установить дополнительный пакет mongodb:
npm install mongodb --save
npm install mongodb-core --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://Simple-Server:cloud@127.0.0.1:27017/?authMechanism=DEFAULT- Simple-Server — имя пользователя;
- cloud — пароль;
- 27017 — порт;
- DEFAULT — механизм авторизации.
Осуществим подключение к серверу с БД:
const {MongoClient} = require('mongodb')
const MongoDBclient = new MongoClient('mongodb://Simple-Server: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://Simple-Server: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://Simple-Server: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://Simple-Server: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://Simple-Server: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://Simple-Server: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://Simple-Server: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. В этом материале мы использовали локальную базу данных, но можно использовать и другие варианты размещения БД. Например, в облаке. В Simple-Server можно арендовать облачную базу данных MongoDB и начать работать в кратчайшие сроки.
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.