Как подключить mongodb к node js
Перейти к содержимому

Как подключить mongodb к node js

  • автор:

Node.js и MongoDB

Наиболее популярной системой управления базами данных для Node.js на данный момент является MongoDB. Для работы с этой платформой прежде всего необходимо установить сам сервер MongoDB. Подробнее как это сделать, описывается здесь. Кроме самого сервера Mongo для взаимодействия с Node.js нам необходим драйвер.

При подключении и взаимодействии с бд в MongoDB можно выделить следующие этапы:

  1. Подключение к серверу
  2. Получение объекта базы данных на сервере
  3. Получение объекта коллекции в базе данных
  4. Взаимодействие с коллекцией (добавление, удаление, получение, изменение данных)

Итак, создадим новый проект. Для этого определим новый каталог, который будет называться mongoapp . Далее определим в этом каталоге новый файл package.json :

В данном случае последняя зависимость — «mongodb» как раз и представляет драйвер. Всю необходимую справочную информацию конкретно по данному драйверу можно найти на https://docs.mongodb.com/drivers/node/current/.

Стоит отметить, что здесь устанавливается версия 4.12. Между подверсиями иной раз бывают очерь существенные отличия. И в этом плане функционал драйвера очень часто меняется.

Далее перейдем к этому каталогу в командной строке/терминале и для добавления всех нужных пакетов выполним команду:

npm install

Подключение к базе данных

Ключевым классом для работы с MongoDB является класс MongoClient , и через него будет идти все взаимодействия с хранилищем данных. Соответственно вначале мы должны получить MongoClient:

const MongoClient = require("mongodb").MongoClient;

В конструктор MongoClient передается строка подключения к серверу:

"mongodb://user:password@host:port/?options

Элементы строки подключения

  • Сначала идет протокол, в качестве которого обычно применяется «mongodb».
  • Затем, если доступ к серверу ограничен логином и паролем, то указывается имя пользователя и через двоеточие пароль («user:password»).
  • Далее указывает хост и порт, по которому запущен сервер MongoDB ( host:port ).
  • В конце после вопросительного знака ? могут указываться дополнительные параметры подключения ( ?options .

Например, определим подключение к локальному серверу MongoDB, который запущен на текущем компьютере на стандартном адресе «127.0.0.1:27017/»:

const MongoClient = require("mongodb").MongoClient; const url = "mongodb://127.0.0.1:27017/"; // создаем объект MongoClient и передаем ему строку подключения const mongoClient = new MongoClient(url);

Для подключения к серверу mongodb применяется метод connect() :

connect(): Promise

Метод возвращает Promise, из которого можно получить тот же объект MongoClient:

const MongoClient = require("mongodb").MongoClient; const client = new MongoClient("mongodb://127.0.0.1:27017/"); client.connect().then(mongoClient=>< console.log("Подключение установлено"); console.log(mongoClient.options.dbName); // получаем имя базы данных >);

Метод then() получает функцию, в которую передается подключенный MongoClient, по сути это тот же объект, что вызвал метод connect. Для теста с помощью свойства mongoClient.options.dbName выводим название базы данных, к которой мы подключены (по умолчанию это база данных test).

В конце завершения работы с бд нам надо закрыть соединение с помощью метода close() .

const MongoClient = require("mongodb").MongoClient; const client = new MongoClient("mongodb://127.0.0.1:27017/"); client.connect().then(mongoClient=>< console.log("Подключение установлено"); // какие-нибудь операции с базой данных MongoDB // закрываем подключение mongoClient.close().then(()=>console.log("Подключение закрыто")); >);

Метод close() также возвращает Promise. Соответственно мы можем вызвать метод then() и в него передать функцию, которая выполняется при закрытии подключения.

Но лепить всю логику взаимодействия через вызовы then() может быть не очень удобно. Поэтому мы также можем использовать другой подход — с использованием async/await :

const MongoClient = require("mongodb").MongoClient; const mongoClient = new MongoClient("mongodb://127.0.0.1:27017/"); async function run() < try < // Подключаемся к серверу await mongoClient.connect(); console.log("Подключение установлено"); // взаимодействие с базой данных >catch(err) < console.log(err); >finally < // Закрываем подключение при завершении работы или при ошибке await mongoClient.close(); console.log("Подключение закрыто"); >> run().catch(console.log);

База данных

После подлючения к серверу мы можем обращаться к базе данных на сервере. Для этого используется метод

const db = client.db("название_бд");

В качестве параметра в метод передается название базы данных, к которой мы хотим подключиться. Результатом функции является объект базы данных, через который мы далее уже сможем обращаться к данным в этой БД.

Для примера выполним ping к базе данных «admin», которая по умолчанию есть на сервере MongoDB:

const MongoClient = require("mongodb").MongoClient; const url = "mongodb://127.0.0.1:27017/"; const mongoClient = new MongoClient(url); async function run() < try < // Подключаемся к серверу await mongoClient.connect(); // обращаемся к базе данных admin const db = mongoClient.db("admin"); // выполняем пинг для проверки подключения const result = await db.command(< ping: 1 >); console.log("Подключение с сервером успешно установлено"); console.log(result); >catch(err) < console.log("Возникла ошибка"); console.log(err); >finally < // Закрываем подключение при завершении работы или при ошибке await mongoClient.close(); console.log("Подключение закрыто"); >> run().catch(console.error);

Для выполнения диагностических команд типа пинга объект базы данных Db предоставляет метод command , который в качестве первого параметра принимает объект диагностики. Например, объект , указывает, что надо выполнить пинг к базе данных, то есть проверить подключение к ней.

Метод command представляет Promise, из которого можно получить предоставляет результат проверки. В данном случае результат проверки возвращается в константу result .

const result = await db.command(< ping: 1 >);

Запустим сервер MongoDb (если он не запущен) и затем запустим наш файл app.js:

Microsoft Windows [Version 10.0.22621.819] (c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены. C:\Users\eugen>cd c:\node\mongoapp c:\node\mongoapp>node app.js Подключение с сервером успешно установлено < ok: 1 >Подключение закрыто c:\node\mongoapp>

Здесь мы видим, что полученный при пинге результат представляет объект

Коллекции

База данных в MongoDB не имеет таблиц. Вместо этого все данные попадают в коллекции. И в рамках node.js для взаимодействия с базой данных (добавления, удаления, чтения данных) нам потребуется получить объект коллекции. Для этого применяется метод db.collection(«название_коллекции») , в который передается название коллекции и который возвращает объект класса Collection , через который мы можем взаимодействовать с этой коллекцией.

В отличие от таблиц в реляционных системах, где все данные хранятся в виде строк, в коллекциях в MongoDB данные хранятся в виде документов. Например, обратимся к коллекции в базе данных. Для этого определим в каталоге проекта следующий файл app.js :

const MongoClient = require("mongodb").MongoClient; const url = "mongodb://127.0.0.1:27017/"; const mongoClient = new MongoClient(url); async function run() < try < await mongoClient.connect(); const db = mongoClient.db("usersdb"); const collection = db.collection("users"); const count = await collection.countDocuments(); console.log(`В коллекции users $документа/ов`); >catch(err) < console.log(err); >finally < await mongoClient.close(); >> run().catch(console.error);

В качестве базы данных здесь используется «usersdb». При этом не важно, что по умолчанию на сервере MongoDB нет подобной базы данных. При первом к ней обращении сервер автоматически ее создаст.

После подключения мы обращаемся к коллекции «users»:

const collection = db.collection("users");

Опять же неважно, что такой коллекции по умолчанию нет в бд usersdb, она также будет создана при первом обращении.

Получив коллекцию, мы можем использовать ее методы. В данном случае для простоты применяется метод countDocuments() , который получает количество документов коллекции. Этот метод возвращает Primise, из которого можно получить собственно результат операции — количество документов. Результат работы:

В коллекции users 0 документов

Connect to MongoDB

Create a file to contain your application called index.js in your node_quickstart project directory.

Copy and paste the following code into the index.js file:

const < MongoClient > = require("mongodb") ;
// Replace the uri string with your connection string.
const uri = "";
const client = new MongoClient( uri) ;
async function run( )
try
const database = client.db('sample_mflix') ;
const movies = database.collection('movies') ;
// Query for a movie that has the title 'Back to the Future'
const query = < title: 'Back to the Future' > ;
const movie = await movies.findOne( query) ;
console.log( movie) ;
> finally
// Ensures that the client will close when you finish/error
await client.close( ) ;
>
>
run( ).catch(console.dir) ;

Как подключиться к MongoDB с помощью Node.js

MongoDB — платформа для коллекций баз данных, хранящих предопределенные данные со схемами, доступ к которым можно получить с помощью языков программирования. Посмотрим, как подключиться к базе данных с помощью Node.js.

Если у вас нет учетной записи MongoDB, обязательно создайте ее (это необходимо для администрирования баз данных).

Создание организации

Итак, мы сосредоточимся на тех услугах, которые предлагает MongoDB. С этого момента будем работать здесь — на облачной странице платформы.

Прежде всего создадим организацию для хранения всех кластеров в одном месте под одним именем. Организация на MongoDB — это нечто вроде отдела, где вы работаете со своей командой и храните все проекты, необходимые для достижения цели.

На главной странице облака можно создать свою организацию и позже пригласить членов команды. Далее введите название организации и выберите MongoDB Atlas.

Создание проекта

Сайт предложит создать проект и заполнить информацию о нем. После этого можно создать первую базу данных, нажав на кнопку кнопку Build a Database .

Создание кластера

На этом шаге нужно определить способ развертывания базы данных. Например, serverless (бессерверный, $0,10/1млн прочтений), dedicated (специальный, $0,80/час) или shared (общий, бесплатный) кластер. Здесь будет использоваться последний.

Далее нужно выбрать облачного провайдера, например AWS, Google Cloud или Azure.

Затем определите примерное местоположение, где вам было бы предпочтительней запустить сервер с базой данных. Просмотрите эти два параметра и измените их при необходимости (но предопределенных параметров должно быть достаточно).

Наконец, выберите имя для кластера.

На этом последнем шаге вы создадите учетные данные для авторизации, с помощью которых можно будет работать с базой данных (имя и пароль).

Затем укажите IP-адреса, которым нужно предоставить доступ для работы с БД. Если хотите разрешить доступ к модификации из любого места, введите IP-адрес 0.0.0.0 .

Инициализация проекта Node.js

Запускаем репозиторий проекта привычным способом — с помощью команды npm init , а затем переходим к заполнению информации о проекте. Нужно установить 2 пакета NPM: mongoose и dotenv .

Пакет mongoose упрощает получение доступа к базам данных MongoDB, а пакет dotenv помогает хранить конфиденциальные данные бэкенда, которые не должны быть видны пользователям фронтенда.

Подключение к базе данных

После создания проекта Node.js со всеми необходимыми элементами можно подключать к нему приложение. На странице развертывания нажмите кнопку Connect на кластере, который мы создали.

Теперь выберите опцию Connect your application . Версию Node.js можно ввести в верхней части модального окна (как и в том случае, если вы подключаетесь на другом языке программирования). Появится строка соединения, с помощью которой можно подключиться через приложение.

Прежде чем вставить строку в приложение, нужно заменить учетные данные для входа теми, что были заданы ранее. Формат учетных данных — username:password .

Теперь можно вставить строку соединения в файл .env с подходящим по значению ключом входа:

MONGODB=mongodb+srv://admin:admin@cluster0.bn1ofkw.mongodb.net/?retryWrites=true&w=majority

Теперь импортируем 2 пакета NPM и извлекаем переменную MONGODB из файла .env в основном файле JavaScript:

const mongoose = require(’mongoose’);
require(’dotenv’).config();
const < MONGODB > = process.env;

Когда все необходимые пакеты и переменные импортированы, установите соединение в основном файле JavaScript:

mongoose.connect( 
MONGODB,
< useNewUrlParser: true, useUnifiedTopology: true >,
() => console.log(’Successfully connected to database.’)
);

После того, как соединение будет установлено, в консоли появится сообщение об успешном подключении.

  • MongoDB: создание базы данных
  • Завершаем настройку мощного API на Nodejs, GraphQL, MongoDB, Hapi, и Swagger. Часть 2
  • 10 лучших фреймворков Node.js

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

Во время разработки приложений на 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" >
]
>)

Пользователь с логином «Timeweb» и паролем «cloud» будет использоваться для подключения к БД.

Настройка среды выполнения

Для подключения приложения Node.js к базе данных MongoDB необходимо установить дополнительный пакет mongodb :

npm install mongodb --save
npm install mongodb-core --save

Подключение

Основным объектом, через который мы будем осуществлять взаимодействие с базой данных MongoDB, является объект класса MongoClient. Импортируем этот класс:

const = 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 = 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 = 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 = 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 = 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 = 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 = 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( , < $set: >)

await MongoDBclient.close()
console.log("Закрыли подключение")
> catch (e) console.log(e)
>
>

Update()

Вот результат до и после. С помощью этого скрипта мы изменили имя в документе.

Обновление нескольких документов
const = 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:[,]> , < $set: >)


await MongoDBclient.close()
console.log("Закрыли подключение")
> catch (e) console.log(e)
>
>

Update()

Вот результат работы:

Заключение

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *