Mongoose - ODM MongoDB Mongoose - инструмент моделирования объектов для Mongodb


Mongoose: MongoDB and Node.js

Применение mongoose для обеспечения взаимодействия приложений, созданных на JS в среде Node.js, с MongoDB

Автор: Владимир Ткаченко

Источник: Обучение в интернет

Продолжение статьи MongoDB Node.JS Driver. Продолжим рассмотрение технологии взаимодействия СУБД MongoDB с приложениями, созданными на JS в среде Node.js. В статье MongoDB Node.JS Driver был рассмотрен драйвер низкого уровня mongodb, который является официальным драйвером Node.js. В этой статье исследуем возможности mongoose, который основан на драйвере MongoDB. Mongoose является официальным ODM (Object Document Mapper) MongoDB, в связи с чем mongoose предоставляет возможность применения строгих типов данных для создания и хранения документов в базе данных MongoDB.

Mongoose - это библиотека JavaScript моделирования объектов для MongoDB в среде NodeJS. Mongoose обеспечивает взаимодействие приложений Node.js с MongoDB. Mongoose предоставляет схемы, которые определяют структуру и тип данных документов, тем самым обеспечивают необходимую структуру БД. Кроме того, mongoose на основании схемы обеспечивает создание модели, после сохранения которой создается документ со свойствами, которые определены в схеме.

Исследуем как mongoose можно использовать в Node.js для моделирования объектов баз данных DBMS MongoDB. Для этого создадим новый проект (директорию), например, SMS_Internet, в которой будут помещены приложения NodeJS с помощью которых будут выполняться CRUD-операции, т.е. операции, выполняемые для создания, чтения, обновления и удаления документов. Проект SMS_Internet с базой "intersmsdb" и коллекцией "Employees", в которую входят документы, включающие в себя набор текстовых полей в формате JSON, типа {name: "Іван Панченко", phone_numer: +380509999999}, предназначен для рассылки SMS сообщений через Internet.

В директории SMS_Internet создадим файл конфигурации package.json, который содержит метаданные для веб-приложения:
{
"name": "SMS_Internet",
"version": "1.0.0",
"description": "Project SMS_Internet",
"dependencies": {
}
}

В каталоге SMS_Internet установим библиотеку mongoose:
npm install mongoose --save
В результате выполнения команды «npm» будет загружен mongoose и будет добавлена запись ("mongoose": "^5.3.12") в файл "package.json"

В командной строке запустим сервер баз данных MongoDB, который находится в папке bin и называется mongod:
C:\mongodb>bin\mongod

Тестовое приложение

Чтобы проверить возможности mongoose создадим тестовое приложение mongtest.js с базой данных "Intest" и поместим его в наш проект SMS_Internet (директорию):


// Подключаем mongoose 
const mongoose = require('mongoose');
// Для подключения к БД Intest применяем метод connect()
mongoose.connect('mongodb://localhost/Intest', function (err) {
 // Оператор throw генерирует ошибку err
   if (err) throw err;
 // Выводим информацию на консоль
   console.log('Соединение установлено');
});				

Теперь запустим наше приложение mongtest.js на выполнение во второй командной строке, для этого перейдем в директорию SMS_Internet, в которой оно помещено:
C:\SMS_Internet>node mongtest.js

Процесс подключения к MongoDB через mongoose
Рис. 1. Скриншот, в котором отображается процесс подключения к MongoDB через mongoose.

Чтобы не отображалось предупреждение "Deprecation Warning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect" в метод connect() добавим опцию { useNewUrlParser: true }.

Создание БД, коллекции и сохранение документа в коллекции

После проверки процесса подключения к MongoDB через интерфейс mongoose создадим приложение employee.js для проекта SMS_Internet с базой данных intersmsdb:


// Подключаем mongoose 
const mongoose = require('mongoose');
// Подключаемся к базе данных intersmsdb
mongoose.connect("mongodb://localhost:27017/intersmsdb", { useNewUrlParser: true });

//  Объявляем схему,  как свойство mongoose
const Schema = mongoose.Schema;
// Определяем схему с двумя свойствами и типами данных, и определяем коллекцию
const employeeSchema = new Schema({ name: String, phone_number: Number }, { collection: 'Employees' });

// Создаем модель, с помощью которой на основе employeeSchema создаем документы
const Employee = mongoose.model('Employee', employeeSchema);
// Определяем объект модели
const employee = new Employee({ name: "Іван Панченко", phone_number: +380509999999 });
 
Сохраняем  объект employee или документ
employee.save(function(err){
// Закрываем соединение с базой данных intersmsdb
    mongoose.disconnect();  
    // Выводим на консоль
    if(err) return console.log(err);
    console.log("Объект сохранен", employee);
});				

Проанализируем приложение employee.js. К приложению подключаем библиотеку mongoose, которая обеспечивает создание схемы и на ее основе создание модели. Схема предназначена только для конкретной коллекции и определяет структуру документов в этой коллекции, а также свойства и типы данных. Схема - это шаблон для создания документов коллекции.

Модель - это средство для манипуляции с данными документов на основе схемы только для одной конкретной коллекции. Схема - это свойство mongoose.Schema, а модель - это метод mongoose.model(), который принимает два параметра, один из которых схема. Например, запись в коллекцию Employees можно осуществить только через модель Employee. Каждый созданный документ на основе модели будет обладать, структурой, свойствами и типом данных, объявленных в схеме.

Запустим приложение employee.js на выполнение во второй командной строке из директории SMS_Internet, в которой оно помещено:
C:\SMS_Internet>node employee.js

Процесс сохранения документа в коллекции
Рис. 2. Скриншот, в котором отображается процесс сохранения документа в коллекции.

Cоздадим четыре приложения на основе библиотеки mongoose для обмена данными с MongoDB, с помощью которых будем апробировать выполнение основных CRUD-операций (create, read, update, delete).

Создание документов в MongoDB с помощью операции create

Для апробации операции create с применением mongoose создадим файл create_mongoose.js в директории SMS_Internet:


// Подключаем mongoose к файлу 
const mongoose = require('mongoose');
// Подключаемся к базе данных intersmsdb 
mongoose.connect("mongodb://localhost:27017/intersmsdb", { useNewUrlParser: true });

// Объявляем схему, как свойство объекта mongoose
const Schema = mongoose.Schema;
// Определяем схему с двумя свойствами: name и phone_number 
const employeeSchema = new Schema({ name: String, phone_number: Number }, {collection: 'Employees'});

// Создаем модель, с помощью которой на основе employeeSchema создаем документы 
const Employee = module.exports = mongoose.model('Employee', employeeSchema);
Employee.create({name: "Роман Сілько", phone_number: 380935555555}, function(err, employee){
    mongoose.disconnect();
      
    if(err) return console.log(err);
      
    console.log("Объект сохранен", employee);
});				

Запустим приложение create_mongoose.js на выполнение во второй командной строке, для этого перейдем в директорию SMS_Internet, в которой оно помещено:
C:\SMS_Internet>node create_mongoose.js

Процесс создания документа в коллекции  Employees БД MongoDB
Рис. 3. Скриншот, в котором отображается процесс создания документа в коллекции Employees БД MongoDB.

Поиск документов в MongoDB с применением mongoose

Существует несколько различных функций для поиска данных определенной модели, к которым относятся: find(), findOne() и findById(). Для апробации функции find() создадим файл find_mongoose.js и поместим его в директорию SMS_Internet:


const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost:27017/intersmsdb", { useNewUrlParser: true });

const Schema = mongoose.Schema;
const employeeSchema = new Schema({name: String, phone_number: Number}, {collection: 'Employees'});

const Employee = module.exports = mongoose.model('Employee', employeeSchema);
Employee.find({}, function(err, employee){
    mongoose.disconnect();
     
    if(err) return console.log(err);
     
    console.log(employee);
});				

Запустим приложение find_mongoose.js на выполнение во второй командной строке, для этого перейдем в директорию SMS_Internet, в которой оно помещено:
C:\SMS_Internet>node find_mongoose.js

Процесс поиск документов в MongoDB с помощью mongoose
Рис. 4. Скриншот, в котором отображается процесс поиск документов в MongoDB с помощью mongoose.

Обновление документов в БД Mongodb

Для изменения документов в базе данных можно применять методы update: updateOne и updateMany.

Для апробации функции updateOne создадим файл update_mongoose.js и поместим его в директорию SMS_Internet:


const mongoose = require("mongoose");
const Schema = mongoose.Schema;
 
mongoose.connect("mongodb://localhost:27017/intersmsdb", { useNewUrlParser: true });
const employeeSchema = new Schema({name: String, phone_number: Number}, {collection: 'Employees'});
const Employee = mongoose.model('Employee', employeeSchema);
 
const userScheme = new Schema({name: String, phone_number: Number}, {versionKey: false});
const User = mongoose.model("User", userScheme);
 
Employee.updateOne({phone_number: +380509999999}, {phone_number: +380963333333}, function(err, result){
     
    mongoose.disconnect();
    if(err) return console.log(err);
    console.log(result);
});				

Теперь запустим это приложение update_mongoose.js на выполнение во второй командной строке из каталога SMS_Internet, в котором он помещен:
C:\WebSMS>node update_mongoose.js

Процесс обновления данных в документах коллекций с помощью mongoose
Рис. 5. Скриншот, в котором отображается процесс обновления данных в документах коллекций с помощью mongoose.

Удаление документов из БД Mongodb

Для удаления документов из коллекций целесообразно использовать deleteOne (для удаления отдельного документа в коллекции, соответствующий фильтру), deleteMany (для удаления все документов в коллекции, соответствующих фильтру).

Для апробации функции deleteMany создадим файл delete_mogoose.js и поместим его в директорию SMS_Internet:


const mongoose = require("mongoose");
const Schema = mongoose.Schema;
 
mongoose.connect("mongodb://localhost:27017/intersmsdb", { useNewUrlParser: true });
 
const employeeSchema = new Schema({name: String, phone_number: Number}, {collection: 'Employees'});
const Employee = mongoose.model('Employee', employeeSchema);
 
Employee.deleteMany({}, function(err, result){
    mongoose.disconnect();
     
    if(err) return console.log(err);
     
    console.log(result);
});				

Теперь запустим это приложение delete_mogoose.js на выполнение во второй командной строке, для этого перейдем в каталог SMS_Internet, в котором он помещен:
C:\WebSMS>node delete_mogoose.js

Процесс удаления документов функцией deleteMany из коллекции
Рис. 6. Скриншот, в котором отображается процесс удаления документов из коллекции

В дальнейшем будет рассмотрено хранение данных в облаке mLab или Atlas MongoDB Cloud и взаимодействие облачных БД с приложениями, созданными на JS в среде Node.js.

Используемые источники информации:

  1. Mongoose v5.3.12: Getting Started. [Электронный ресурс]. – Режим доступа: https://mongoosejs.com/docs/
  2. CRUD в Mongoose. [Электронный ресурс]. – Режим доступа: https://metanit.com/web/nodejs/6.8.php
  3. Введение в Mongoose для MongoDB и Node.js. [Электронный ресурс]. – Режим доступа: https://code.tutsplus.com/ru/articles/an-introduction-to-mongoose-for-mongodb-and-nodejs--cms-29527"