Создание базы данных и взаимодействие с ней MONGO !== MANGO В мире JavaScript и Node.js MongoDB зарекомендовала себя как базовая база данных. Это «M» в популярных стеках MEAN и MERN, и обычно он считается более гибким и легким в масштабировании, чем традиционные технологии баз данных, такие как MySQL. Разберем 4 основные части при работе с MONGO DB Создадим облачную базу данных с помощью MongoDB Atlas, Подключимся к ней с помощью Node.js и Mongoose Создадим модели для наших данных с помощью Mongoose Предоставим конечные точки API для выполнения общих операций с базой данных. Часть 1. Создание облачной базы данных в MongoDB Atlas MongoDB Atlas - это официальная служба облачных баз данных, предлагаемая MongoDB. Хотя мы могли бы настроить экземпляр MongoDB локально, начать работу с Atlas намного проще. Мы будем использовать его бесплатный уровень. Регистрируемся тут После успешного входа в систему вы должны создать свой первый проект (не стесняйтесь называть его как хотите). Затем нажмите «Создать новый кластер». Вы должны увидеть такой экран: Выберите место нахождения вашего нового сервера. Это совершенно бесплатно, и вам разрешается один бесплатный кластер для каждой учетной записи. В этом руководстве мы сохраним имя кластера по умолчанию: «Cluster0». Установить права пользователя Теперь нам нужно определить пользователей и установить разрешения. В меню навигации слева нажмите «Доступ к базе данных», затем нажмите «Добавить нового пользователя». В этом руководстве мы создадим пользователя с именем «test_user» с паролем «123456». (Для ваших собственных проектов я рекомендую гораздо более безопасные учетные данные!) Установить сетевые разрешения Вот первое препятствие, которое вызвало у меня много проблем в начале: чтобы получить доступ к своей базе данных, вам необходимо внести определенные IP-адреса в белый список. Поскольку я работаю удаленно во многих разных местах, мой IP-адрес постоянно менялся, и моя база данных не могла подключиться. Мне потребовалось слишком много времени, чтобы понять, что проблема была в сетевых разрешениях! Если вы знаете, что ваш IP-адрес всегда будет таким же, просто внесите свой IP-адрес в белый список. Если вы перемещаетесь, как я, вы можете использовать IP-адрес 0.0.0.0/0, чтобы разрешить доступ с любого IP-адреса. Поскольку это менее безопасно, имеет смысл сохранить его как временный белый список, как на изображении ниже: Получить URI Наконец, вернитесь на страницу «Кластеры» и под названием своего кластера нажмите «Connect». В списке вариантов выберите «Connect Your Application», и вы получите следующий URI подключения: Это строка потребуется для подключения к базе данных, она пригодится нам позже. Часть 2: Подключение к базе данных с помощью Node.js и Mongoose Убедитесь, что у вас установлен Node, затем откройте свой терминал, перейдите в новый каталог по вашему выбору и введите npm init Вы можете принять все значения по умолчанию и просто нажимать Enter. У вас создастся файл package.json Далее нам необходимо установить Mongoose и Express сервер yarn add express mongoose Создайте файл с именем server.js в корневом каталоге. Теперь мы импортируем наши новые модули вверху: const express = require('express'); const mongoose = require('mongoose'); const app = express(); немного ниже выполним подключение к нашей базе данных. Помните ту ссылку выше? Которую нужно было запомнить? mongoose.connect('mongodb+srv://admin:<password>@cluster0.7yrpe.mongodb.net/myFirstDatab ase?retryWrites=true&w=majority') .then(() => console.log("Db is connected")) .catch(() => console.log("Db is not connected")) В целом ваш файл server.js теперь должен выглядеть так: const express = require('express'); const mongoose = require('mongoose'); const app = express(); mongoose.connect('mongodb+srv://admin:<password>@cluster0.7yrpe.mongodb.net/myFirstDatab ase?retryWrites=true&w=majority') .then(() => console.log("Db is connected")) .catch(() => console.log("Db is not connected")) Нам остается только добавить запуск сервера в наш файл server.js const port = 8000 app.listen(port, () => console.log( Server started on port: http://localhost:${port} )); И теперь наш server.js выглядит так: const express = require('express'); const mongoose = require('mongoose'); const app = express(); mongoose.connect('mongodb+srv://admin:<password>@cluster0.7yrpe.mongodb.net/myFirstDatab ase?retryWrites=true&w=majority') .then(() => console.log("Db is connected")) .catch(() => console.log("Db is not connected")) const port = 8000 app.listen(port, () => console.log(`Server started on port: http://localhost:${port}`)); Теперь мы будем использовать сервер постоянно, поэтому давайте установим nodemon глобально, чтобы сервер автоматически обновлялся при каждом сохранении yarn add nodemon -g Для запуска проекта вводим в терминал команду nodemon server и если вы все сделали правильно, то вы увидите в консоли сообщение, что подключение к базе данных произошло успешно Часть 3: Создание моделей для наших данных с помощью Mongoose Одним из преимуществ MongoDB является отсутствие схемы: нет необходимости настраивать таблицы заранее, поэтому вы можете отправлять данные, не беспокоясь о правильном заполнении каждого поля. Но что, если вы хотите определять объекты с помощью строго типизированной схемы? Вот где приходит на помощь Mongoose. Mongoose популярен, потому что он обеспечивает простой способ структурирования MongoDB и множество связанных с этим преимуществ. В этом уроке мы создадим «животную» модель для веб-сайта по охране животных. Рекомендуется хранить наши модели в отдельном каталоге models. Итак, создайте каталог моделей и в нем файл с именем animal.js. Для простоты наша AnimalSchema будет принимать только три параметра: name, которое принимает строку; isEndangered, который принимает логическое значение, и dateOfEntry: const mongoose = require('mongoose'); const Schema = mongoose.Schema; const AnimalSchema = new Schema({ name: { type: String, required: true }, isEndangered: { type: Boolean, default: true }, dateOfEntry: { type: Date, default: Date.now() } }); module.exports = Item = mongoose.model('animal', AnimalSchema); Теперь я продемонстрирую, как использовать Mongoose для простого выполнения четырех наиболее важных операций с базой данных: создания, чтения, обновления и удаления. Создавать Вернувшись в server.js, мы можем импортировать нашу модель, создать новое животное и добавить его в нашу базу данных с помощью метода сохранения. Например, мы могли бы добавить следующее в конец server.js, чтобы сохранить новую запись для красной панды: const Animal = require('./models/Animal'); const newAnimal = new Animal({ name: 'Red Panda', isEndangered: true }) newAnimal .save() .then(item => console.log(item)) .catch(err => console.log(err)) Наш сервер автоматически перезапустится, мы должны увидеть объект JSON, представляющий наш новый элемент в консоли. Чтобы узнать, удалось ли это сделать, снова войдите в MongoDB Atlas, перейдите в свой кластер и нажмите «Коллекции»: вы должны увидеть коллекцию «животные» и внутри нее наши новые документы. Попробуйте добавить еще несколько собственных элементов, чтобы у нас было несколько документов в нашей базе данных. Читать Чтобы дважды проверить, правильно ли мы добавили наш элемент, давайте закомментируем код, использованный для сохранения нового документа. Теперь давайте прочитаем каждый документ в нашей базе данных с помощью нашей модели Animal: Mongoose упрощает это с помощью метода поиска: Animal.find() .sort({ date: -1 }) .then(items => console.log(items)) find возвращает обещание, которое затем можно упорядочить с помощью метода сортировки. Здесь -1 используется для упорядочивания элементов по времени их создания, причем самые свежие находятся вверху. Обратите внимание, что каждому элементу автоматически присвоено свойство _id. Затем мы узнаем, как обновить элемент, поэтому скопируйте _id из вашей записи Red Panda. Обновить Если мы услышим хорошие новости о том, что красные панды больше не находятся под угрозой исчезновения, нам нужно будет обновить нашу базу данных с помощью метода findOneAndUpdate. Это требует двух аргументов. Первый содержит наш запрос - информацию, используемую для поиска нашей записи. Второй содержит обновление - любые поля, которые мы хотим изменить. Чтобы пометить нашу красную панду как не находящуюся под угрозой исчезновения, обязательно укажите свой идентификатор _id в коде ниже: Animal .findOneAndUpdate( { _id: '5d14cd34e8dbe65a6417915b' }, { new: true } ) .then(item => console.log(item)) Удалить Нам нужно только немного изменить наш код, чтобы полностью удалить запись: Animal .findOneAndDelete( { _id: '5d14cd34e8dbe65a6417915b' }, { new: true } ) .then(console.log('Item deleted')) Теперь вы знаете самые важные методы для Mongoose и MongoDB!