👾
Node.js
  • 🧑‍💻Full-Stack Web Developer
  • 📚Теорія
    • 1️⃣Основи Node.js
      • Вступ
      • Модулі Node.js
      • Запуск скриптів модулів в Node.js
      • Структура проєкту, експорт-імпорт, index.js як хаб
      • Модулі CommonJS
      • Модулі MJS
      • Модулі ECMAScript
      • Модулі NPM + базові модулі
      • Глобальні змінні
      • Робота з файлами
    • 2️⃣Консольні додатки
      • Створення консольних додатків
    • 3️⃣Фреймворк Express
      • Про Express
      • Nodemon і запуски скриптів
      • Postman
      • Проміжне ПЗ middleware
      • Передача даних на сервер
      • Роутінг
      • CRUD
      • Налаштування лінтера
    • 4️⃣REST API
      • Змінні оточення
      • Логування
      • REST
      • Методи HTTP
      • CORS
      • Формування URL для REST API
      • Контроллери відсутнього роуту і непередбачуваної помилки
      • Валідація даних Joi
      • Рефакторинг додатку за MVC архітектурою
      • Express автогенератор додатку
    • 5️⃣База даних Mongo.DB
      • Основи MongoDB
      • Налаштування Mongo Atlas
      • Встановлення локальної MongoDB і основні команди
    • 6️⃣ODM Mongoose
      • Mongoose
      • Порядок планування бекенд додатку
      • чорнетка
    • 7️⃣Автентифякація WJT
      • чорнетка
      • чорнетка 2
    • 8️⃣Файли
      • чернетка
    • 9️⃣тестування
      • чернетка
    • 🔟Page 14
      • імейли
    • чорнетка докер
    • чорнетка сокети
    • додаткові матеріали
    • 👷Практика
      • 1️⃣Page 4
      • 2️⃣Page 5
      • 3️⃣Page 6
      • 4️⃣Page 7
      • 5️⃣Page 8
      • 6️⃣Page 9
  • Про мене
    • Про мене
Powered by GitBook
On this page
  • Підключення до бази даних
  • Схема документа
  • Індекси
  • Унікальні поля
  • Обов'язкові поля
  • Методи в об'єкта схеми
  • Операції з даними в Mongoose
  • Створення документів
  • Отримання документів
  • Видалення документів
  • Зміна полів в документі
  1. Теорія
  2. ODM Mongoose

Mongoose

Mongoose - це спеціальна ODM-бібліотека (Object Data Modelling) для роботи з MongoDB. Ця бібліотека дозволяє спростити роботу з базою даних та структурувати схеми колекцій та документів. Також можна реалізувати валідацію даних.

terminal
npm i mongoose

Підключення бібліотеки

const mongoose = require('mongoose');

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

Підключення до самої бази даних виконується методом mongoose.connect(). В нього першим параметром передають адресу підключення до бази даних, а другим можна передати об'єкт налаштувань. Оскільки це асинхронна функція, то повертає проміс, тому потрібно передбачити відловлення помилки(then і catch).

В цілому підключення до бази даних відбувається в головному файлі програми (наприклад index.js) одразу після налаштування оточення, адже переважно з оточення і береться посилання на базу даних

index.js
const mongoose = require('mongoose');
//code

// ===========MONGO DB CONNECTOIN=========== //
mongoose
  .connect(process.env.MONGO_URL)
  .then((con) => {
    console.log('Mongo DB successfully connected..');
  })
  .catch((err) => {
    console.log(err);

    process.exit(1);
  });

Тут process.env.MONGO_URL - посилання на базу даних, яке береться з оточення.

За допомогою методу mongoose.disconnect() можна відключитися від бази даних.

Схема документа

Mongoose допомагає описати дані за певною схемою. Для цього бібліотека має клас Schema. Вона зазвичай описується в окремому файлі схеми. Також буде використовуватися і модель документа на базі створеної схеми. Спочатку потрібно під'єднати клас:

const { model, Schema } = require("mongoose");

Встановимо схему:

const userSchema = new Schema({
  name: String,
  age: Number,
});

Схема містить метадані об'єктів в яких вказується, які властивості матиме обʼєкт і який тип даних.

Доступні такі значення типів: String, Number, Date, Buffer, Boolean, Mixed, Objectid, Array.

Для складних властивостей (наприклад об'єкт) замість типу вказують визначення цього об'єкта.

const userSchema = new Schema({
  name: String,
  age: Number,
  additional: {
    address: [String], // тип - масив рядків
    birthday: Date,
  },
});

По суті ми описали валідацію типів даних полів майбутнього документа. Але можна використати ширші параметри валідації від mongoose. В такому разі в схемі для кожного поля потрібно описати обʼєкт з правилами валідації. Доступні такі параметри:

required - вказує, що це поле обовʼязкове

min та max - задає мінімальне та максимальне значення для числових даних

minlength та maxlength - задає мінімальну та максимальну довжину для рядків

enum - рядок повинен мати одне із значень із вказаного масиву рядків

match - рядок повинен відповідати регулярному виразу

const userSchema = new Schema({
  name: {
    type: String,
    minlength: 2,
    maxlength: 40,
    required: [true, 'Nickname is required'],
  },
  age: {
    type: Number,
    min: 1,
    max: 50,
  },
  additional: {
    address: [String], // тип - масив рядків
    birthday: Date,
  },
  role: {
    type: String,
    enum: ['admin', 'user', 'moderator'],
    default: 'user',
  },
});

Якщо спробувати додати некоректні дані до бази даних, то запит на додавання поверне помилку.

Далі потрібно створити модель на основі описаної схеми:

const User = model('user', userSchema);

У цьому записі перший параметр у методі mongoose.model вказує на назву моделі (так буде називатися і колекція в базі даних), а другий параметр - це схема описана раніше.

Далі можна створювати об'єкти для цієї моделі:

const user = new User({
  name: 'Alex',
  age: 20,
});

Щоб зберегти обʼєкт в базі даних - викликаємо метод save. Метод повертає результат, об'єкт типу Document, який представляє конкретний документ що зберігається в колекції.

const result = user.save();
console.log('User saved to DB! ', result);

Індекси

Якщо поле будуть часто використовувати при пошуку документів, то йому можна призначити індекс. Індексування полів пришвидшує пошук. Індекс до поля можна додати двома способами.

  1. Визначити у самій схемі

const userSchema = new Schema({
  name: { type: String, index: 1 },
  age: Number,
});
  1. Викликати метод index у самій схемі

const userSchema = new Schema({
  name: String,
  age: Number,
});

userSchema.index({ name: 1 });

Унікальні поля

Значення поля можна зробити унікальним. Тобто, в інших документах колекції не може бути такого поля з таким же значенням. Наприклад, поле emaіl, для схеми, варто описати як унікальне. Для цього у схемі, вказують властивість unique

const userSchema = new Schema({
  name: String,
  email: { type: String, unique: true },
});

Обов'язкові поля

Деякі поля повинні бути обовʼязкові. для цього вказують властивість required. Опціонально можна вказати повідомлення, яке повернеться у випадку відсутності цього поля.

const userSchema = new Schema({
  name: {
    type: String,
    required: [true, 'Name is required'],
  },
  email: { type: String, unique: true, required: true },
});

Методи в об'єкта схеми

У схемах можна створювати власні методи. Для цього використовують функцію Schema.methods. Всередині функції доступ до об'єкта схеми відбувається за посиланням this. Для прикладу створимо функцію, яка повертає повне ім'я користувача.

const userSchema = new Schema({
  firstName: String,
  lastName: String,
});

userSchema.methods.fullName = function () {
  return `${this.firstName} ${this.lastName}`;
};

Отримавши екземпляр документа з бази, можна викликати функцію fullName() яка повертає повне ім'я та прізвище користувача.

Операції з даними в Mongoose

Створення документів

Крім згаданого методу save() можна використати метод від моделі об'єкта User.create(). Першим параметром методу передається об'єкт для збереження.

User.create({
  name: 'Alex',
  age: 20,
});

Отримання документів

Для отримання даних використовують метод find. Він повертає масив об'єктів типу документ:

find([query], [options]);

Метод findOne повертає перший об'єкт документа, який збігається із запитом:

findOne([query], [options]);

Видалення документів

Для видалення застосовуються метод remove. З колекції видаляються всі документи, що збігаються із запитом:

remove([query], [options]);

Метод findOneAndRemove видаляє з колекції перший документ, що збігається із запитом

findOneAndRemove([query], [options]);

Зміна полів в документі

Метод update оновлює в колекції всі документи, що збігаються із запитом:

update([query], [update], [options]);

Метод findOneAndUpdate оновлює в колекції перший документ, що збігається із запитом.

findOneAndUpdate([query], [update], [options]);

Покликання:

PreviousODM MongooseNextПорядок планування бекенд додатку

Last updated 1 year ago

📚
6️⃣
Офіційна документація Mongoose
NPM Mongoose